use self::cik::CIK;
use crate as cik;
use schemars::JsonSchema;
impl JsonSchema for CIK {
fn schema_name() -> String {
"CIK".to_string()
}
fn json_schema(_gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
use schemars::schema::{
InstanceType, Schema, SchemaObject, SingleOrVec, SubschemaValidation,
};
let integer_schema = SchemaObject {
instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::Integer))),
number: Some(Box::new(schemars::schema::NumberValidation {
minimum: Some(0.0),
maximum: Some(9_999_999_999.0),
..Default::default()
})),
..Default::default()
};
let string_schema = SchemaObject {
instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::String))),
string: Some(Box::new(schemars::schema::StringValidation {
pattern: Some(r"^\d{1,10}$".to_string()),
..Default::default()
})),
..Default::default()
};
let schema = SchemaObject {
subschemas: Some(Box::new(SubschemaValidation {
any_of: Some(vec![
Schema::Object(integer_schema),
Schema::Object(string_schema),
]),
..Default::default()
})),
..Default::default()
};
schema.into()
}
}
#[cfg(test)]
mod tests {
use crate::*;
use serde_json::json;
#[test]
fn schema_generation() {
let schema = ::schemars::schema_for!(CIK);
let schema_json = serde_json::to_value(&schema).unwrap();
assert_eq!(schema_json["title"], "CIK");
assert!(schema_json["anyOf"].is_array());
assert_eq!(schema_json["anyOf"][0]["type"], "integer");
assert_eq!(schema_json["anyOf"][1]["type"], "string");
}
#[test]
fn schema_validation() {
let schema = ::schemars::schema_for!(CIK);
let schema_json = serde_json::to_value(&schema).unwrap();
let compiled = jsonschema::Validator::new(&schema_json).unwrap();
assert!(compiled.is_valid(&json!(320193)));
assert!(compiled.is_valid(&json!("320193")));
assert!(compiled.is_valid(&json!(1)));
assert!(compiled.is_valid(&json!("1")));
assert!(compiled.is_valid(&json!(9_999_999_999u64)));
assert!(compiled.is_valid(&json!("9999999999")));
assert!(compiled.is_valid(&json!("0000000001")));
assert!(!compiled.is_valid(&json!(-1)));
assert!(!compiled.is_valid(&json!(10_000_000_000u64)));
assert!(!compiled.is_valid(&json!(""))); assert!(!compiled.is_valid(&json!("12345678901"))); assert!(!compiled.is_valid(&json!("123ABC"))); assert!(!compiled.is_valid(&json!(3.5))); }
#[test]
#[cfg(feature = "serde")]
fn schema_matches_serde() {
let cik = build(320193).unwrap();
let serialized = serde_json::to_value(cik).unwrap();
let schema = ::schemars::schema_for!(CIK);
let schema_json = serde_json::to_value(&schema).unwrap();
let compiled = jsonschema::Validator::new(&schema_json).unwrap();
assert!(compiled.is_valid(&serialized));
}
#[test]
#[cfg(all(feature = "serde", feature = "schemars"))]
fn struct_with_cik_roundtrip() {
let json_str = r#"{
"name": "Apple Inc.",
"cik": 320193,
"active": true
}"#;
let json_value: serde_json::Value = serde_json::from_str(json_str).unwrap();
let cik_schema = ::schemars::schema_for!(CIK);
let cik_schema_json = serde_json::to_value(&cik_schema).unwrap();
let compiled = jsonschema::Validator::new(&cik_schema_json).unwrap();
assert!(compiled.is_valid(&json_value["cik"]));
let test_cik = build(320193).unwrap();
let serialized_cik = serde_json::to_value(test_cik).unwrap();
assert!(compiled.is_valid(&serialized_cik));
assert_eq!(serialized_cik, 320193);
let deserialized_cik: CIK = serde_json::from_value(json_value["cik"].clone()).unwrap();
assert_eq!(deserialized_cik.value(), 320193);
let leading_zero_cik: CIK = serde_json::from_str("\"0000000001\"").unwrap();
assert_eq!(leading_zero_cik.value(), 1);
let reserialized_cik = serde_json::to_value(deserialized_cik).unwrap();
assert!(compiled.is_valid(&reserialized_cik));
assert_eq!(reserialized_cik, 320193);
}
}