Skip to content

Commit f55f699

Browse files
authored
Merge pull request #36 from MathiasKoch/enhancement/serialize-external-buffer
Add to_slice serialization function
2 parents a0bc7e9 + 0e5bbfb commit f55f699

File tree

6 files changed

+284
-219
lines changed

6 files changed

+284
-219
lines changed

src/de/mod.rs

Lines changed: 109 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -741,22 +741,22 @@ mod tests {
741741

742742
#[test]
743743
fn array() {
744-
assert_eq!(crate::from_str::<[i32; 0]>("[]"), Ok([]));
745-
assert_eq!(crate::from_str("[0, 1, 2]"), Ok([0, 1, 2]));
744+
assert_eq!(crate::from_str::<[i32; 0]>("[]"), Ok(([], 2)));
745+
assert_eq!(crate::from_str("[0, 1, 2]"), Ok(([0, 1, 2], 9)));
746746

747747
// errors
748748
assert!(crate::from_str::<[i32; 2]>("[0, 1,]").is_err());
749749
}
750750

751751
#[test]
752752
fn bool() {
753-
assert_eq!(crate::from_str("true"), Ok(true));
754-
assert_eq!(crate::from_str(" true"), Ok(true));
755-
assert_eq!(crate::from_str("true "), Ok(true));
753+
assert_eq!(crate::from_str("true"), Ok((true, 4)));
754+
assert_eq!(crate::from_str(" true"), Ok((true, 5)));
755+
assert_eq!(crate::from_str("true "), Ok((true, 5)));
756756

757-
assert_eq!(crate::from_str("false"), Ok(false));
758-
assert_eq!(crate::from_str(" false"), Ok(false));
759-
assert_eq!(crate::from_str("false "), Ok(false));
757+
assert_eq!(crate::from_str("false"), Ok((false, 5)));
758+
assert_eq!(crate::from_str(" false"), Ok((false, 6)));
759+
assert_eq!(crate::from_str("false "), Ok((false, 6)));
760760

761761
// errors
762762
assert!(crate::from_str::<bool>("true false").is_err());
@@ -765,42 +765,54 @@ mod tests {
765765

766766
#[test]
767767
fn enum_clike() {
768-
assert_eq!(crate::from_str(r#" "boolean" "#), Ok(Type::Boolean));
769-
assert_eq!(crate::from_str(r#" "number" "#), Ok(Type::Number));
770-
assert_eq!(crate::from_str(r#" "thing" "#), Ok(Type::Thing));
768+
assert_eq!(crate::from_str(r#" "boolean" "#), Ok((Type::Boolean, 11)));
769+
assert_eq!(crate::from_str(r#" "number" "#), Ok((Type::Number, 10)));
770+
assert_eq!(crate::from_str(r#" "thing" "#), Ok((Type::Thing, 9)));
771771
}
772772

773773
#[test]
774774
fn str() {
775-
assert_eq!(crate::from_str(r#" "hello" "#), Ok("hello"));
776-
assert_eq!(crate::from_str(r#" "" "#), Ok(""));
777-
assert_eq!(crate::from_str(r#" " " "#), Ok(" "));
778-
assert_eq!(crate::from_str(r#" "👏" "#), Ok("👏"));
775+
assert_eq!(crate::from_str(r#" "hello" "#), Ok(("hello", 9)));
776+
assert_eq!(crate::from_str(r#" "" "#), Ok(("", 4)));
777+
assert_eq!(crate::from_str(r#" " " "#), Ok((" ", 5)));
778+
assert_eq!(crate::from_str(r#" "👏" "#), Ok(("👏", 8)));
779779

780780
// no unescaping is done (as documented as a known issue in lib.rs)
781-
assert_eq!(crate::from_str(r#" "hel\tlo" "#), Ok("hel\\tlo"));
782-
assert_eq!(crate::from_str(r#" "hello \\" "#), Ok("hello \\\\"));
781+
assert_eq!(crate::from_str(r#" "hel\tlo" "#), Ok(("hel\\tlo", 11)));
782+
assert_eq!(crate::from_str(r#" "hello \\" "#), Ok(("hello \\\\", 12)));
783783

784784
// escaped " in the string content
785-
assert_eq!(crate::from_str(r#" "foo\"bar" "#), Ok(r#"foo\"bar"#));
786-
assert_eq!(crate::from_str(r#" "foo\\\"bar" "#), Ok(r#"foo\\\"bar"#));
787-
assert_eq!(crate::from_str(r#" "foo\"\"bar" "#), Ok(r#"foo\"\"bar"#));
788-
assert_eq!(crate::from_str(r#" "\"bar" "#), Ok(r#"\"bar"#));
789-
assert_eq!(crate::from_str(r#" "foo\"" "#), Ok(r#"foo\""#));
790-
assert_eq!(crate::from_str(r#" "\"" "#), Ok(r#"\""#));
785+
assert_eq!(crate::from_str(r#" "foo\"bar" "#), Ok((r#"foo\"bar"#, 12)));
786+
assert_eq!(
787+
crate::from_str(r#" "foo\\\"bar" "#),
788+
Ok((r#"foo\\\"bar"#, 14))
789+
);
790+
assert_eq!(
791+
crate::from_str(r#" "foo\"\"bar" "#),
792+
Ok((r#"foo\"\"bar"#, 14))
793+
);
794+
assert_eq!(crate::from_str(r#" "\"bar" "#), Ok((r#"\"bar"#, 9)));
795+
assert_eq!(crate::from_str(r#" "foo\"" "#), Ok((r#"foo\""#, 9)));
796+
assert_eq!(crate::from_str(r#" "\"" "#), Ok((r#"\""#, 6)));
791797

792798
// non-excaped " preceded by backslashes
793-
assert_eq!(crate::from_str(r#" "foo bar\\" "#), Ok(r#"foo bar\\"#));
794-
assert_eq!(crate::from_str(r#" "foo bar\\\\" "#), Ok(r#"foo bar\\\\"#));
799+
assert_eq!(
800+
crate::from_str(r#" "foo bar\\" "#),
801+
Ok((r#"foo bar\\"#, 13))
802+
);
803+
assert_eq!(
804+
crate::from_str(r#" "foo bar\\\\" "#),
805+
Ok((r#"foo bar\\\\"#, 15))
806+
);
795807
assert_eq!(
796808
crate::from_str(r#" "foo bar\\\\\\" "#),
797-
Ok(r#"foo bar\\\\\\"#)
809+
Ok((r#"foo bar\\\\\\"#, 17))
798810
);
799811
assert_eq!(
800812
crate::from_str(r#" "foo bar\\\\\\\\" "#),
801-
Ok(r#"foo bar\\\\\\\\"#)
813+
Ok((r#"foo bar\\\\\\\\"#, 19))
802814
);
803-
assert_eq!(crate::from_str(r#" "\\" "#), Ok(r#"\\"#));
815+
assert_eq!(crate::from_str(r#" "\\" "#), Ok((r#"\\"#, 6)));
804816
}
805817

806818
#[test]
@@ -810,10 +822,13 @@ mod tests {
810822
led: bool,
811823
}
812824

813-
assert_eq!(crate::from_str(r#"{ "led": true }"#), Ok(Led { led: true }));
825+
assert_eq!(
826+
crate::from_str(r#"{ "led": true }"#),
827+
Ok((Led { led: true }, 15))
828+
);
814829
assert_eq!(
815830
crate::from_str(r#"{ "led": false }"#),
816-
Ok(Led { led: false })
831+
Ok((Led { led: false }, 16))
817832
);
818833
}
819834

@@ -826,17 +841,17 @@ mod tests {
826841

827842
assert_eq!(
828843
crate::from_str(r#"{ "temperature": -17 }"#),
829-
Ok(Temperature { temperature: -17 })
844+
Ok((Temperature { temperature: -17 }, 22))
830845
);
831846

832847
assert_eq!(
833848
crate::from_str(r#"{ "temperature": -0 }"#),
834-
Ok(Temperature { temperature: -0 })
849+
Ok((Temperature { temperature: -0 }, 21))
835850
);
836851

837852
assert_eq!(
838853
crate::from_str(r#"{ "temperature": 0 }"#),
839-
Ok(Temperature { temperature: 0 })
854+
Ok((Temperature { temperature: 0 }, 20))
840855
);
841856

842857
// out of range
@@ -853,33 +868,39 @@ mod tests {
853868

854869
assert_eq!(
855870
crate::from_str(r#"{ "temperature": -17.2 }"#),
856-
Ok(Temperature { temperature: -17.2 })
871+
Ok((Temperature { temperature: -17.2 }, 24))
857872
);
858873

859874
assert_eq!(
860875
crate::from_str(r#"{ "temperature": -0.0 }"#),
861-
Ok(Temperature { temperature: -0. })
876+
Ok((Temperature { temperature: -0. }, 23))
862877
);
863878

864879
assert_eq!(
865880
crate::from_str(r#"{ "temperature": -2.1e-3 }"#),
866-
Ok(Temperature {
867-
temperature: -2.1e-3
868-
})
881+
Ok((
882+
Temperature {
883+
temperature: -2.1e-3
884+
},
885+
26
886+
))
869887
);
870888

871889
assert_eq!(
872890
crate::from_str(r#"{ "temperature": -3 }"#),
873-
Ok(Temperature { temperature: -3. })
891+
Ok((Temperature { temperature: -3. }, 21))
874892
);
875893

876894
use core::f32;
877895

878896
assert_eq!(
879897
crate::from_str(r#"{ "temperature": -1e500 }"#),
880-
Ok(Temperature {
881-
temperature: f32::NEG_INFINITY
882-
})
898+
Ok((
899+
Temperature {
900+
temperature: f32::NEG_INFINITY
901+
},
902+
25
903+
))
883904
);
884905

885906
assert!(crate::from_str::<Temperature>(r#"{ "temperature": 1e1e1 }"#).is_err());
@@ -899,17 +920,23 @@ mod tests {
899920

900921
assert_eq!(
901922
crate::from_str(r#"{ "description": "An ambient temperature sensor" }"#),
902-
Ok(Property {
903-
description: Some("An ambient temperature sensor"),
904-
})
923+
Ok((
924+
Property {
925+
description: Some("An ambient temperature sensor"),
926+
},
927+
50
928+
))
905929
);
906930

907931
assert_eq!(
908932
crate::from_str(r#"{ "description": null }"#),
909-
Ok(Property { description: None })
933+
Ok((Property { description: None }, 23))
910934
);
911935

912-
assert_eq!(crate::from_str(r#"{}"#), Ok(Property { description: None }));
936+
assert_eq!(
937+
crate::from_str(r#"{}"#),
938+
Ok((Property { description: None }, 2))
939+
);
913940
}
914941

915942
#[test]
@@ -921,12 +948,12 @@ mod tests {
921948

922949
assert_eq!(
923950
crate::from_str(r#"{ "temperature": 20 }"#),
924-
Ok(Temperature { temperature: 20 })
951+
Ok((Temperature { temperature: 20 }, 21))
925952
);
926953

927954
assert_eq!(
928955
crate::from_str(r#"{ "temperature": 0 }"#),
929-
Ok(Temperature { temperature: 0 })
956+
Ok((Temperature { temperature: 0 }, 20))
930957
);
931958

932959
// out of range
@@ -940,8 +967,8 @@ mod tests {
940967
#[derive(Debug, Deserialize, PartialEq)]
941968
struct Xy(i8, i8);
942969

943-
assert_eq!(crate::from_str(r#"[10, 20]"#), Ok(Xy(10, 20)));
944-
assert_eq!(crate::from_str(r#"[10, -20]"#), Ok(Xy(10, -20)));
970+
assert_eq!(crate::from_str(r#"[10, 20]"#), Ok((Xy(10, 20), 8)));
971+
assert_eq!(crate::from_str(r#"[10, -20]"#), Ok((Xy(10, -20), 9)));
945972

946973
// wrong number of args
947974
assert_eq!(
@@ -960,8 +987,8 @@ mod tests {
960987
#[derive(Debug, Deserialize, PartialEq)]
961988
struct Xy(i8, i8);
962989

963-
assert_eq!(crate::from_str(r#"[10, 20]"#), Ok(Xy(10, 20)));
964-
assert_eq!(crate::from_str(r#"[10, -20]"#), Ok(Xy(10, -20)));
990+
assert_eq!(crate::from_str(r#"[10, 20]"#), Ok((Xy(10, 20), 8)));
991+
assert_eq!(crate::from_str(r#"[10, -20]"#), Ok((Xy(10, -20), 9)));
965992

966993
// wrong number of args
967994
assert_eq!(
@@ -985,31 +1012,31 @@ mod tests {
9851012

9861013
assert_eq!(
9871014
crate::from_str(r#"{ "temperature": 20, "high": 80, "low": -10, "updated": true }"#),
988-
Ok(Temperature { temperature: 20 })
1015+
Ok((Temperature { temperature: 20 }, 62))
9891016
);
9901017

9911018
assert_eq!(
9921019
crate::from_str(
9931020
r#"{ "temperature": 20, "conditions": "windy", "forecast": "cloudy" }"#
9941021
),
995-
Ok(Temperature { temperature: 20 })
1022+
Ok((Temperature { temperature: 20 }, 66))
9961023
);
9971024

9981025
assert_eq!(
9991026
crate::from_str(r#"{ "temperature": 20, "hourly_conditions": ["windy", "rainy"] }"#),
1000-
Ok(Temperature { temperature: 20 })
1027+
Ok((Temperature { temperature: 20 }, 62))
10011028
);
10021029

10031030
assert_eq!(
10041031
crate::from_str(
10051032
r#"{ "temperature": 20, "source": { "station": "dock", "sensors": ["front", "back"] } }"#
10061033
),
1007-
Ok(Temperature { temperature: 20 })
1034+
Ok((Temperature { temperature: 20 }, 84))
10081035
);
10091036

10101037
assert_eq!(
10111038
crate::from_str(r#"{ "temperature": 20, "invalid": this-is-ignored }"#),
1012-
Ok(Temperature { temperature: 20 })
1039+
Ok((Temperature { temperature: 20 }, 49))
10131040
);
10141041

10151042
assert_eq!(
@@ -1107,29 +1134,32 @@ mod tests {
11071134
}
11081135
"#
11091136
),
1110-
Ok(Thing {
1111-
properties: Properties {
1112-
temperature: Property {
1113-
ty: Type::Number,
1114-
unit: Some("celsius"),
1115-
description: Some("An ambient temperature sensor"),
1116-
href: "/properties/temperature",
1117-
},
1118-
humidity: Property {
1119-
ty: Type::Number,
1120-
unit: Some("percent"),
1121-
description: None,
1122-
href: "/properties/humidity",
1123-
},
1124-
led: Property {
1125-
ty: Type::Boolean,
1126-
unit: None,
1127-
description: Some("A red LED"),
1128-
href: "/properties/led",
1137+
Ok((
1138+
Thing {
1139+
properties: Properties {
1140+
temperature: Property {
1141+
ty: Type::Number,
1142+
unit: Some("celsius"),
1143+
description: Some("An ambient temperature sensor"),
1144+
href: "/properties/temperature",
1145+
},
1146+
humidity: Property {
1147+
ty: Type::Number,
1148+
unit: Some("percent"),
1149+
description: None,
1150+
href: "/properties/humidity",
1151+
},
1152+
led: Property {
1153+
ty: Type::Boolean,
1154+
unit: None,
1155+
description: Some("A red LED"),
1156+
href: "/properties/led",
1157+
},
11291158
},
1159+
ty: Type::Thing,
11301160
},
1131-
ty: Type::Thing,
1132-
})
1161+
852
1162+
))
11331163
)
11341164
}
11351165
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub mod ser;
7474
#[doc(inline)]
7575
pub use self::de::{from_slice, from_str};
7676
#[doc(inline)]
77-
pub use self::ser::{to_string, to_vec};
77+
pub use self::ser::{to_slice, to_string, to_vec};
7878

7979
#[allow(deprecated)]
8080
unsafe fn uninitialized<T>() -> T {

0 commit comments

Comments
 (0)