primitive-types 0.13.1

Primitive types shared by Ethereum and Substrate
Documentation
use super::*;
#[cfg(not(feature = "std"))]
use alloc::{
	borrow::ToOwned,
	string::{String, ToString},
};

use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema};

impl JsonSchema for H160 {
	fn schema_name() -> String {
		"HexEncoded20Bytes".to_owned()
	}

	fn json_schema(gen: &mut SchemaGenerator) -> Schema {
		let mut schema = gen.subschema_for::<String>().into_object();
		schema.metadata().description = Some("Hex encoded 20 bytes".to_string());
		schema.string().pattern = Some("^0(x|X)[a-fA-F0-9]{40}$".to_string());
		schema.into()
	}
}

impl JsonSchema for U256 {
	fn schema_name() -> String {
		"U256String".to_string()
	}

	fn json_schema(gen: &mut SchemaGenerator) -> Schema {
		let mut schema = gen.subschema_for::<String>().into_object();
		schema.metadata().description = Some("256-bit Unsigned Integer".to_string());
		schema.string().pattern = Some("^(0|[1-9][0-9]{0,77})$".to_string());
		schema.into()
	}
}

#[cfg(test)]
#[cfg(any(feature = "serde", feature = "serde_no_std"))]
mod tests {
	use crate::{H160, U256};
	#[cfg(not(feature = "std"))]
	use alloc::string::String;
	use jsonschema::Draft;
	use schemars::JsonSchema;

	#[test]
	fn hex_encoded_20_bytes() {
		let schema = H160::json_schema(&mut schemars::gen::SchemaGenerator::default());
		let schema_json = serde_json::to_value(&schema).unwrap();
		let schema = jsonschema::JSONSchema::options()
			.with_draft(Draft::Draft7)
			.compile(&schema_json)
			.unwrap();
		let value = serde_json::to_value("0x55086adeca661185c437d92b9818e6eda6d0d047").unwrap();
		assert!(schema.validate(&value).is_ok());
		let value = serde_json::to_value("0X0E9C8DA9FD4BDD3281879D9E328D8D74D02558CC").unwrap();
		assert!(schema.validate(&value).is_ok());

		let value = serde_json::to_value("42").unwrap();
		assert!(schema.validate(&value).is_err());
	}

	#[test]
	fn u256() {
		let schema = U256::json_schema(&mut schemars::gen::SchemaGenerator::default());
		let schema_json = serde_json::to_value(&schema).unwrap();
		let schema = jsonschema::JSONSchema::options()
			.with_draft(Draft::Draft7)
			.compile(&schema_json)
			.unwrap();
		let addr = serde_json::to_value("42").unwrap();
		assert!(schema.validate(&addr).is_ok());
		let addr = serde_json::to_value(['1'; 79].into_iter().collect::<String>()).unwrap();
		assert!(schema.validate(&addr).is_err());
	}
}