Skip to content

Commit f41e504

Browse files
committed
v0.2.0
1 parent 38306ad commit f41e504

File tree

8 files changed

+965
-502
lines changed

8 files changed

+965
-502
lines changed

jsonfixer_rust/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[package]
22
name = "jsonfixer_rust"
3-
version = "0.1.0"
3+
version = "0.2.0"
44
edition = "2021"
55
authors = ["DedInc"]
6-
description = "A Rust implementation of jsonfixer4j with JNI bindings"
6+
description = "A Rust implementation of jsonfixer4j with JNI bindings - High-performance JSON auto-correction"
77
license = "MIT"
88

99
[lib]
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
use crate::parser::JSONParser;
2+
use crate::serializer::JSONSerializer;
3+
use crate::token_fixer::JSONTokenFixer;
4+
use crate::tokenizer::JSONTokenizer;
5+
use serde_json::{Map, Value};
6+
7+
/// Main JSON auto-correction engine
8+
/// Combines tokenization, fixing, parsing, and serialization
9+
pub struct JSONAutoCorrector {
10+
tokenizer: JSONTokenizer,
11+
parser: JSONParser,
12+
serializer: JSONSerializer,
13+
}
14+
15+
impl JSONAutoCorrector {
16+
pub fn new() -> Self {
17+
Self {
18+
tokenizer: JSONTokenizer::new(),
19+
parser: JSONParser::new(),
20+
serializer: JSONSerializer::new(),
21+
}
22+
}
23+
24+
/// Auto-correct broken JSON string
25+
/// This is the main entry point for JSON correction
26+
pub fn autocorrect(&mut self, input: &str) -> String {
27+
// Step 1: Tokenize the input
28+
let tokens = self.tokenizer.tokenize(input);
29+
30+
// Step 2: Fix token stream (add missing brackets, etc.)
31+
let fixed_tokens = JSONTokenFixer::fix_tokens(tokens);
32+
33+
// Step 3: Parse tokens into JSON value
34+
let parse_result = self.parser.parse(&fixed_tokens, 0);
35+
36+
// Step 4: Get the result value or default to empty object
37+
let result = match parse_result.value {
38+
Some(value) => value,
39+
None => Value::Object(Map::new()),
40+
};
41+
42+
// Step 5: Serialize back to JSON string
43+
self.serializer.serialize(&result)
44+
}
45+
46+
/// Auto-correct and return pretty-printed JSON
47+
pub fn autocorrect_pretty(&mut self, input: &str) -> String {
48+
let tokens = self.tokenizer.tokenize(input);
49+
let fixed_tokens = JSONTokenFixer::fix_tokens(tokens);
50+
let parse_result = self.parser.parse(&fixed_tokens, 0);
51+
52+
let result = match parse_result.value {
53+
Some(value) => value,
54+
None => Value::Object(Map::new()),
55+
};
56+
57+
self.serializer.serialize_pretty(&result)
58+
}
59+
}
60+
61+
impl Default for JSONAutoCorrector {
62+
fn default() -> Self {
63+
Self::new()
64+
}
65+
}
66+
67+
#[cfg(test)]
68+
mod tests {
69+
use super::*;
70+
71+
#[test]
72+
fn test_autocorrect_missing_brace() {
73+
let mut corrector = JSONAutoCorrector::new();
74+
let result = corrector.autocorrect(r#"{"key":42"#);
75+
assert_eq!(result, r#"{"key":42}"#);
76+
}
77+
78+
#[test]
79+
fn test_autocorrect_missing_bracket() {
80+
let mut corrector = JSONAutoCorrector::new();
81+
let result = corrector.autocorrect(r#"{"key":[1,2,3}"#);
82+
assert_eq!(result, r#"{"key":[1,2,3]}"#);
83+
}
84+
85+
#[test]
86+
fn test_autocorrect_missing_comma() {
87+
let mut corrector = JSONAutoCorrector::new();
88+
let result = corrector.autocorrect(r#"{"key1":42 "key2":true}"#);
89+
assert_eq!(result, r#"{"key1":42,"key2":true}"#);
90+
}
91+
92+
#[test]
93+
fn test_autocorrect_incomplete_string() {
94+
let mut corrector = JSONAutoCorrector::new();
95+
let result = corrector.autocorrect(r#"{"title":"Hello"#);
96+
assert_eq!(result, r#"{"title":"Hello"}"#);
97+
}
98+
99+
#[test]
100+
fn test_autocorrect_partial_literals() {
101+
let mut corrector = JSONAutoCorrector::new();
102+
103+
let result = corrector.autocorrect(r#"{"flag":tr}"#);
104+
assert_eq!(result, r#"{"flag":true}"#);
105+
106+
let result = corrector.autocorrect(r#"{"flag":fals}"#);
107+
assert_eq!(result, r#"{"flag":false}"#);
108+
109+
let result = corrector.autocorrect(r#"{"value":nul}"#);
110+
assert_eq!(result, r#"{"value":null}"#);
111+
}
112+
113+
#[test]
114+
fn test_autocorrect_trailing_comma() {
115+
let mut corrector = JSONAutoCorrector::new();
116+
let result = corrector.autocorrect(r#"{"key1":1,"key2":2,}"#);
117+
assert_eq!(result, r#"{"key1":1,"key2":2}"#);
118+
}
119+
120+
#[test]
121+
fn test_autocorrect_nested_incomplete() {
122+
let mut corrector = JSONAutoCorrector::new();
123+
let result = corrector.autocorrect(r#"{"outer":{"inner":[1,2,3"#);
124+
assert_eq!(result, r#"{"outer":{"inner":[1,2,3]}}"#);
125+
}
126+
}
127+

0 commit comments

Comments
 (0)