μson (uson) is a shorthand for JSON
at main 16 kB view raw
1use uson::{parse, apply_builtin_types, Value, Number}; 2use serde_json; 3 4fn parse_and_apply_types(input: &str) -> Vec<Value> { 5 let values = parse(input).expect("Parse should succeed"); 6 values.into_iter().map(apply_builtin_types).collect() 7} 8 9fn to_array_mode(values: &[Value]) -> serde_json::Value { 10 serde_json::to_value(values).unwrap() 11} 12 13fn to_object_mode(values: &[Value]) -> serde_json::Value { 14 let mut result = serde_json::Map::new(); 15 let mut non_object_index = 0; 16 17 for value in values.iter() { 18 match value { 19 Value::Object(obj) => { 20 for (key, val) in obj { 21 result.insert(key.clone(), serde_json::to_value(val).unwrap()); 22 } 23 } 24 _ => { 25 result.insert(non_object_index.to_string(), serde_json::to_value(value).unwrap()); 26 non_object_index += 1; 27 } 28 } 29 } 30 31 serde_json::Value::Object(result) 32} 33 34// BASIC TESTS 35 36#[test] 37fn test_empty_input() { 38 let values = parse_and_apply_types(""); 39 assert_eq!(to_array_mode(&values), serde_json::json!([])); 40 assert_eq!(to_object_mode(&values), serde_json::json!({})); 41} 42 43#[test] 44fn test_empty_whitespace() { 45 let values = parse_and_apply_types(" "); 46 assert_eq!(to_array_mode(&values), serde_json::json!([])); 47 assert_eq!(to_object_mode(&values), serde_json::json!({})); 48} 49 50#[test] 51fn test_empty_newlines() { 52 let values = parse_and_apply_types("\n "); 53 assert_eq!(to_array_mode(&values), serde_json::json!([])); 54 assert_eq!(to_object_mode(&values), serde_json::json!({})); 55} 56 57#[test] 58fn test_simple_values() { 59 let values = parse_and_apply_types("a b c"); 60 assert_eq!(to_array_mode(&values), serde_json::json!(["a", "b", "c"])); 61 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "a", "1": "b", "2": "c"})); 62} 63 64#[test] 65fn test_nested_array_single() { 66 let values = parse_and_apply_types("[a]"); 67 assert_eq!(to_array_mode(&values), serde_json::json!([["a"]])); 68 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a"]})); 69} 70 71#[test] 72fn test_nested_array_multiple() { 73 let values = parse_and_apply_types("[a b c]"); 74 assert_eq!(to_array_mode(&values), serde_json::json!([["a", "b", "c"]])); 75 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a", "b", "c"]})); 76} 77 78#[test] 79fn test_nested_array_deep() { 80 let values = parse_and_apply_types("[a [[b]] c]"); 81 assert_eq!(to_array_mode(&values), serde_json::json!([["a", [["b"]], "c"]])); 82 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a", [["b"]], "c"]})); 83} 84 85#[test] 86fn test_simple_objects() { 87 let values = parse_and_apply_types("a:1 b:2 c:3"); 88 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}, {"b": 2}, {"c": 3}])); 89 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": 2, "c": 3})); 90} 91 92#[test] 93fn test_simple_objects_in_array() { 94 let values = parse_and_apply_types("[a:1 b:2 c:3]"); 95 assert_eq!(to_array_mode(&values), serde_json::json!([[{"a": 1}, {"b": 2}, {"c": 3}]])); 96 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [{"a": 1}, {"b": 2}, {"c": 3}]})); 97} 98 99#[test] 100fn test_type_str() { 101 let values = parse_and_apply_types("str!42"); 102 assert_eq!(to_array_mode(&values), serde_json::json!(["42"])); 103 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "42"})); 104} 105 106#[test] 107fn test_type_nested() { 108 let values = parse_and_apply_types("int!str!42"); 109 assert_eq!(to_array_mode(&values), serde_json::json!([42])); 110 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42})); 111} 112 113#[test] 114fn test_type_triple_nested() { 115 let values = parse_and_apply_types("str!int!str!42"); 116 assert_eq!(to_array_mode(&values), serde_json::json!(["42"])); 117 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "42"})); 118} 119 120#[test] 121fn test_type_in_object() { 122 let values = parse_and_apply_types("x:{test:str!42 multi:bool!str!true}"); 123 assert_eq!( 124 to_array_mode(&values), 125 serde_json::json!([{"x": {"test": "42", "multi": true}}]) 126 ); 127 assert_eq!( 128 to_object_mode(&values), 129 serde_json::json!({"x": {"test": "42", "multi": true}}) 130 ); 131} 132 133#[test] 134fn test_type_str_array() { 135 let values = parse_and_apply_types("str![1 2 3]"); 136 assert_eq!(to_array_mode(&values), serde_json::json!(["1,2,3"])); 137 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "1,2,3"})); 138} 139 140#[test] 141fn test_type_nonexistent() { 142 let values = parse_and_apply_types("nonexists!42"); 143 assert_eq!(to_array_mode(&values), serde_json::json!([42])); 144 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42})); 145} 146 147#[test] 148fn test_type_custom_name() { 149 let values = parse_and_apply_types("A_b3-!42"); 150 assert_eq!(to_array_mode(&values), serde_json::json!([42])); 151 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42})); 152} 153 154#[test] 155fn test_advanced_example() { 156 let values = parse_and_apply_types( 157 r#"number:12.05 text:Banana quotedText:"John Devilseed" empty:null good:true"# 158 ); 159 assert_eq!( 160 to_array_mode(&values), 161 serde_json::json!([ 162 {"number": 12.05}, 163 {"text": "Banana"}, 164 {"quotedText": "John Devilseed"}, 165 {"empty": null}, 166 {"good": true} 167 ]) 168 ); 169 assert_eq!( 170 to_object_mode(&values), 171 serde_json::json!({ 172 "number": 12.05, 173 "text": "Banana", 174 "quotedText": "John Devilseed", 175 "empty": null, 176 "good": true 177 }) 178 ); 179} 180 181// TYPE TESTS 182 183#[test] 184fn test_number_integer() { 185 let values = parse_and_apply_types("1"); 186 assert_eq!(to_array_mode(&values), serde_json::json!([1])); 187 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 1})); 188} 189 190#[test] 191fn test_number_float() { 192 let values = parse_and_apply_types("42.42"); 193 assert_eq!(to_array_mode(&values), serde_json::json!([42.42])); 194 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42.42})); 195} 196 197#[test] 198fn test_number_negative() { 199 let values = parse_and_apply_types("-50.43"); 200 assert_eq!(to_array_mode(&values), serde_json::json!([-50.43])); 201 assert_eq!(to_object_mode(&values), serde_json::json!({"0": -50.43})); 202} 203 204#[test] 205fn test_number_large() { 206 let values = parse_and_apply_types("1000000.0001"); 207 assert_eq!(to_array_mode(&values), serde_json::json!([1000000.0001])); 208 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 1000000.0001})); 209} 210 211#[test] 212fn test_number_scientific() { 213 let values = parse_and_apply_types("10e5"); 214 assert_eq!(to_array_mode(&values), serde_json::json!([10e5])); 215 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 10e5})); 216} 217 218#[test] 219fn test_float_type_cast() { 220 let values = parse_and_apply_types(r#"float!"42.42""#); 221 assert_eq!(to_array_mode(&values), serde_json::json!([42.42])); 222 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42.42})); 223} 224 225#[test] 226fn test_string_simple() { 227 let values = parse_and_apply_types("abc"); 228 assert_eq!(to_array_mode(&values), serde_json::json!(["abc"])); 229 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc"})); 230} 231 232#[test] 233fn test_string_starts_with_digit() { 234 let values = parse_and_apply_types("1ab"); 235 assert_eq!(to_array_mode(&values), serde_json::json!(["1ab"])); 236 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "1ab"})); 237} 238 239#[test] 240fn test_string_multiple() { 241 let values = parse_and_apply_types("abc def"); 242 assert_eq!(to_array_mode(&values), serde_json::json!(["abc", "def"])); 243 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc", "1": "def"})); 244} 245 246#[test] 247fn test_string_double_quoted() { 248 let values = parse_and_apply_types(r#""abc""#); 249 assert_eq!(to_array_mode(&values), serde_json::json!(["abc"])); 250 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc"})); 251} 252 253#[test] 254fn test_string_double_quoted_with_space() { 255 let values = parse_and_apply_types(r#""abc def""#); 256 assert_eq!(to_array_mode(&values), serde_json::json!(["abc def"])); 257 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc def"})); 258} 259 260#[test] 261fn test_string_double_quoted_escaped() { 262 let values = parse_and_apply_types(r#""abc \"ok def""#); 263 assert_eq!(to_array_mode(&values), serde_json::json!([r#"abc "ok def"#])); 264 assert_eq!(to_object_mode(&values), serde_json::json!({"0": r#"abc "ok def"#})); 265} 266 267#[test] 268fn test_string_single_quoted() { 269 let values = parse_and_apply_types("'abc'"); 270 assert_eq!(to_array_mode(&values), serde_json::json!(["abc"])); 271 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc"})); 272} 273 274#[test] 275fn test_string_single_quoted_with_space() { 276 let values = parse_and_apply_types("'abc def'"); 277 assert_eq!(to_array_mode(&values), serde_json::json!(["abc def"])); 278 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc def"})); 279} 280 281#[test] 282fn test_string_single_quoted_escaped() { 283 let values = parse_and_apply_types(r#"'abc \'42 def'"#); 284 assert_eq!(to_array_mode(&values), serde_json::json!(["abc '42 def"])); 285 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc '42 def"})); 286} 287 288#[test] 289fn test_null_value() { 290 let values = parse_and_apply_types("null"); 291 assert_eq!(to_array_mode(&values), serde_json::json!([null])); 292 assert_eq!(to_object_mode(&values), serde_json::json!({"0": null})); 293} 294 295#[test] 296fn test_null_typed() { 297 let values = parse_and_apply_types("x:null!xx"); 298 assert_eq!(to_array_mode(&values), serde_json::json!([{"x": null}])); 299 assert_eq!(to_object_mode(&values), serde_json::json!({"x": null})); 300} 301 302#[test] 303fn test_true_value() { 304 let values = parse_and_apply_types("true"); 305 assert_eq!(to_array_mode(&values), serde_json::json!([true])); 306 assert_eq!(to_object_mode(&values), serde_json::json!({"0": true})); 307} 308 309#[test] 310fn test_bool_true_typed() { 311 let values = parse_and_apply_types(r#"bool!"true""#); 312 assert_eq!(to_array_mode(&values), serde_json::json!([true])); 313 assert_eq!(to_object_mode(&values), serde_json::json!({"0": true})); 314} 315 316#[test] 317fn test_false_value() { 318 let values = parse_and_apply_types("false"); 319 assert_eq!(to_array_mode(&values), serde_json::json!([false])); 320 assert_eq!(to_object_mode(&values), serde_json::json!({"0": false})); 321} 322 323#[test] 324fn test_bool_false_typed() { 325 let values = parse_and_apply_types(r#"bool!"false""#); 326 assert_eq!(to_array_mode(&values), serde_json::json!([false])); 327 assert_eq!(to_object_mode(&values), serde_json::json!({"0": false})); 328} 329 330#[test] 331fn test_array_single() { 332 let values = parse_and_apply_types("[a]"); 333 assert_eq!(to_array_mode(&values), serde_json::json!([["a"]])); 334 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a"]})); 335} 336 337#[test] 338fn test_array_numbers_no_comma() { 339 let values = parse_and_apply_types("[1 2 3]"); 340 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]])); 341 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]})); 342} 343 344#[test] 345fn test_array_numbers_with_commas() { 346 let values = parse_and_apply_types("[1, 2, 3]"); 347 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]])); 348 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]})); 349} 350 351#[test] 352fn test_array_numbers_mixed_commas() { 353 let values = parse_and_apply_types("[1 2,3 ]"); 354 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]])); 355 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]})); 356} 357 358#[test] 359fn test_array_typed() { 360 let values = parse_and_apply_types(r#"arr!"1,2,3""#); 361 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]])); 362 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]})); 363} 364 365#[test] 366fn test_object_single() { 367 let values = parse_and_apply_types("{a:1}"); 368 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}])); 369 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1})); 370} 371 372#[test] 373fn test_object_multiple_no_comma() { 374 let values = parse_and_apply_types("{a:1 b:two c:3}"); 375 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1, "b": "two", "c": 3}])); 376 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": "two", "c": 3})); 377} 378 379#[test] 380fn test_object_multiple_with_commas() { 381 let values = parse_and_apply_types("{a:1,b:two,c:3}"); 382 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1, "b": "two", "c": 3}])); 383 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": "two", "c": 3})); 384} 385 386#[test] 387fn test_object_typed() { 388 let values = parse_and_apply_types(r#"obj!'"a":1'"#); 389 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}])); 390 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1})); 391} 392 393#[test] 394fn test_object_nested() { 395 let values = parse_and_apply_types("x:{a:1 b:coffee}"); 396 assert_eq!( 397 to_array_mode(&values), 398 serde_json::json!([{"x": {"a": 1, "b": "coffee"}}]) 399 ); 400 assert_eq!( 401 to_object_mode(&values), 402 serde_json::json!({"x": {"a": 1, "b": "coffee"}}) 403 ); 404} 405 406#[test] 407fn test_assign_simple() { 408 let values = parse_and_apply_types("a:1"); 409 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}])); 410 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1})); 411} 412 413#[test] 414fn test_assign_multiple() { 415 let values = parse_and_apply_types("a:1 b:2 c:3"); 416 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}, {"b": 2}, {"c": 3}])); 417 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": 2, "c": 3})); 418} 419 420#[test] 421fn test_assign_single_quoted_key() { 422 let values = parse_and_apply_types("'a':1"); 423 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}])); 424 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1})); 425} 426 427#[test] 428fn test_assign_double_quoted_key() { 429 let values = parse_and_apply_types(r#""a":1"#); 430 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}])); 431 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1})); 432} 433 434#[test] 435fn test_assign_special_chars() { 436 let values = parse_and_apply_types("~@$%^&*()-:1"); 437 assert_eq!(to_array_mode(&values), serde_json::json!([{"~@$%^&*()-": 1}])); 438 assert_eq!(to_object_mode(&values), serde_json::json!({"~@$%^&*()-": 1})); 439} 440 441#[test] 442fn test_comment_empty() { 443 let values = parse_and_apply_types("#"); 444 assert_eq!(to_array_mode(&values), serde_json::json!([])); 445 assert_eq!(to_object_mode(&values), serde_json::json!({})); 446} 447 448#[test] 449fn test_comment_escaped_hash() { 450 let values = parse_and_apply_types(r"a:\#"); 451 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": "#"}])); 452 assert_eq!(to_object_mode(&values), serde_json::json!({"a": "#"})); 453} 454 455#[test] 456fn test_comment_in_quotes() { 457 let values = parse_and_apply_types(r"a:'\#1'"); 458 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": "#1"}])); 459 assert_eq!(to_object_mode(&values), serde_json::json!({"a": "#1"})); 460} 461 462#[test] 463fn test_comment_after_value() { 464 let values = parse_and_apply_types("a:1 # a"); 465 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}])); 466 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1})); 467} 468 469#[test] 470fn test_comment_with_spaces() { 471 let values = parse_and_apply_types(" # a"); 472 assert_eq!(to_array_mode(&values), serde_json::json!([])); 473 assert_eq!(to_object_mode(&values), serde_json::json!({})); 474} 475 476#[test] 477fn test_comment_line_start() { 478 let values = parse_and_apply_types("#a"); 479 assert_eq!(to_array_mode(&values), serde_json::json!([])); 480 assert_eq!(to_object_mode(&values), serde_json::json!({})); 481} 482 483#[test] 484fn test_comment_in_array() { 485 let values = parse_and_apply_types("x: [a # b c]\n# good\n tone ]"); 486 assert_eq!(to_array_mode(&values), serde_json::json!([{"x": ["a", "tone"]}])); 487 assert_eq!(to_object_mode(&values), serde_json::json!({"x": ["a", "tone"]})); 488} 489 490#[test] 491fn test_comment_complex() { 492 let values = parse_and_apply_types("{x: [#y ]\n] #n\n} 42 #^\n@"); 493 assert_eq!(to_array_mode(&values), serde_json::json!([{"x": []}, 42, "@"])); 494 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42, "1": "@", "x": []})); 495}