///|
/// Check the core JCS invariant that canonicalizing an already canonical value
/// is idempotent.
pub fn canonical_idempotent(value : JsonValue) -> Result[Bool, CanonicalError] {
let first = match canonicalize(value) {
Ok(value) => value
Err(error) => return Err(error)
}
let reparsed = match parse(first) {
Ok(value) => value
Err(error) => return Err(InvalidNumber(first, error.message()))
}
let second = match canonicalize(reparsed) {
Ok(value) => value
Err(error) => return Err(error)
}
Ok(first == second)
}
///|
pub fn canonical_idempotent_document(input : String) -> Result[Bool, String] {
let value = match parse(input) {
Ok(value) => value
Err(error) => return Err(error.message())
}
match canonical_idempotent(value) {
Ok(result) => Ok(result)
Err(error) => Err(error.message())
}
}