diff --git a/.gitignore b/.gitignore index 2c1d75e..15c17af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ /target/ -/Cargo.lock /.gitattributes /.idea/ *.iml diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b9d92f0 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,142 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "dyn-clone" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "schemars" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "serde" +version = "1.0.179" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5bf42b8d227d4abf38a1ddb08602e229108a517cd4e5bb28f9c7eaafdce5c0" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-cw-value" +version = "0.7.0" +dependencies = [ + "schemars", + "serde", + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.179" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741e124f5485c7e60c03b043f79f320bff3527f4bbf12cf3831750dc46a0ec2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" diff --git a/Cargo.toml b/Cargo.toml index 9962372..c710711 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,8 +10,19 @@ readme = "README.md" keywords = ["serde", "wasm"] license = "MIT" +[features] +default = ["std"] + +std = [] +schema = ["std", "dep:schemars"] + [dependencies] -serde = "^1.0.0" +serde = { version = "1.0.103", default-features = false, features = [ + "derive", + "alloc", +] } +schemars = { version = "0.8.3", optional = true } + [dev-dependencies] serde_derive = "^1.0.0" diff --git a/src/de.rs b/src/de.rs index c846cb7..2d8b21f 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1,10 +1,6 @@ -use serde::{de, forward_to_deserialize_any}; -use std::collections::BTreeMap; -use std::error::Error; -use std::fmt; -use std::marker::PhantomData; - +use crate::no_std::*; use crate::Value; +use serde::{de, forward_to_deserialize_any}; #[derive(Debug)] pub enum Unexpected { diff --git a/src/lib.rs b/src/lib.rs index fd291bd..45326f5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,17 @@ +#![cfg_attr(not(feature = "std"), no_std)] +#![feature(error_in_core)] + +#[cfg(not(feature = "std"))] +extern crate alloc; + +use crate::no_std::*; use serde::Deserialize; -use std::cmp::Ordering; -use std::collections::BTreeMap; -use std::hash::{Hash, Hasher}; pub use de::*; pub use ser::*; mod de; +mod no_std; mod ser; #[derive(Clone, Debug)] @@ -113,6 +118,17 @@ impl Ord for Value { } } +#[cfg(feature = "schema")] +impl schemars::JsonSchema for Value { + fn schema_name() -> String { + "JSON".to_string() + } + + fn json_schema(_gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + schemars::schema::Schema::from(true) + } +} + impl Value { fn discriminant(&self) -> usize { match *self { diff --git a/src/no_std.rs b/src/no_std.rs new file mode 100644 index 0000000..b003d85 --- /dev/null +++ b/src/no_std.rs @@ -0,0 +1,32 @@ +#[cfg(feature = "std")] +pub use std::{ + borrow::ToOwned, + boxed::Box, + cmp::Ordering, + collections::BTreeMap, + error::Error, + fmt, + hash::{Hash, Hasher}, + marker::PhantomData, + string::{String, ToString}, + vec, + vec::Vec, +}; + +#[cfg(not(feature = "std"))] +pub use alloc::{ + borrow::ToOwned, + boxed::Box, + collections::BTreeMap, + string::{String, ToString}, + vec, + vec::Vec, +}; +#[cfg(not(feature = "std"))] +pub use core::{ + cmp::Ordering, + error::Error, + fmt, + hash::{Hash, Hasher}, + marker::PhantomData, +}; diff --git a/src/ser.rs b/src/ser.rs index 9dcbdcb..164895e 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -1,9 +1,6 @@ -use serde::ser; -use std::collections::BTreeMap; -use std::error::Error; -use std::fmt; - +use crate::no_std::*; use crate::Value; +use serde::ser; #[derive(Debug)] pub enum SerializerError {