Strict JSON parsing and deterministic JSON canonicalization for MoonBit.
Dependencies
moon check --deny-warn
moon test --deny-warnmoon run cmd/main -- canonicalize '[1, true, null]'
moon run cmd/main -- digest '[1, true, null]'
moon run cmd/main -- inspect --json '[1, true, null]'
moon run cmd/main -- diff '[1]' '[2]'///|
let value = parse("{\"b\":2,\"a\":1}") catch { error => panic() }
///|
let canonical = canonicalize(value) catch { error => panic() }
// canonical == "{\"a\":1,\"b\":2}"
///|
let digest = canonical_digest(value) catch { error => panic() }pub(all) struct AnalysisReport {
valid : Bool
stats : JsonStats
canonical : String?
digest : String?
error : String?
}pub(all) struct CanonicalCheck {
valid_json : Bool
canonical : Bool
normalized : String?
reason : String?
}pub(all) struct CanonicalDocument {
canonical : String
digest : String
byte_length : Int
stats : JsonStats
issue_count : Int
}pub enum CanonicalError {
InvalidNumber(String, String)
NonFiniteNumber(String)
}pub(all) struct CanonicalIssue {
path : String
kind : CanonicalIssueKind
source : String
canonical : String
}pub enum CanonicalIssueKind {
NumberSpelling
ObjectMemberOrder
}pub enum CanonicalPolicy {
RequireCanonical
Normalize
ReportOnly
}pub enum ChangeOperation {
Add
Remove
Replace
}pub(all) struct ChangePlan {
path : String
operation : ChangeOperation
before : String?
after : String?
}pub enum DiffKind {
Added
Removed
Changed
TypeChanged
}pub(all) struct DigestEntry {
name : String
digest : String
byte_length : Int
}pub(all) struct DocumentLimits {
max_depth : Int
max_values : Int
max_array_length : Int
max_object_members : Int
max_string_length : Int
max_number_length : Int
}pub enum JsonEvent {
BeginObject(String, Int)
EndObject(String)
BeginArray(String, Int)
EndArray(String)
Scalar(String, String, String)
}pub(all) struct JsonProfile {
stats : JsonStats
key_count : Int
unique_key_count : Int
max_key_length : Int
max_string_length : Int
negative_zero_count : Int
canonical_issue_count : Int
}pub(all) struct JsonStats {
value_count : Int
object_count : Int
array_count : Int
string_count : Int
number_count : Int
boolean_count : Int
null_count : Int
max_depth : Int
max_array_length : Int
max_object_members : Int
}pub enum JsonTokenKind {
LeftBrace
RightBrace
LeftBracket
RightBracket
Colon
Comma
StringLiteral
NumberLiteral
TrueLiteral
FalseLiteral
NullLiteral
End
}pub(all) struct KeyFrequency {
key : String
count : Int
}pub enum LimitViolation {
DepthExceeded(String, Int)
ValuesExceeded(String, Int)
ArrayTooLong(String, Int)
ObjectTooLarge(String, Int)
StringTooLong(String, Int)
NumberTooLong(String, Int)
}pub(all) struct NumberInfo {
original : String
canonical : String
kind : NumberKind
negative_zero : Bool
}pub enum NumberKind {
Zero
Integer
Fraction
Exponent
}pub enum ParseError {
UnexpectedEnd(Int)
UnexpectedCharacter(Int, Char)
Expected(Int, String)
InvalidEscape(Int, String)
InvalidNumber(Int, String)
DuplicateKey(Int, String)
TrailingContent(Int)
}pub(all) struct PolicyDecision {
accepted : Bool
canonical : String?
digest : String?
issues : Array[CanonicalIssue]
error : String?
}pub(all) struct SourceLocation {
offset : Int
line : Int
column : Int
}pub(all) struct SourceStats {
character_count : Int
line_count : Int
whitespace_count : Int
token_count : Int
max_token_length : Int
source_bytes : Int
}pub enum TreeIssueKind {
DuplicateKey
InvalidNumber
DepthLimit
}fn apply_patch_documents(input : String, operations : Array[PatchOperation]) -> Result[String, String]fn canonical_idempotent_document(input : String) -> Result[Bool, String]fn canonicalize_json(input : String) -> Result[String, String]fn compare_object_keys(left : String, right : String) -> Intfn digest_json(input : String) -> Result[String, String]fn evaluate_policy(input : String, limits : DocumentLimits, policy : CanonicalPolicy) -> PolicyDecisionfn library_version() -> Stringfn merge_patch_documents(target : String, patch : String) -> Result[String, String]fn prepare_document_with_limits(input : String, limits : DocumentLimits) -> Result[CanonicalDocument, String]fn pretty_document(input : String, indent_width : Int) -> Result[String, String]fn redact_document(input : String, pointers : Array[String], replacement_json : String) -> Result[String, String]fn sha256_bytes(bytes : Bytes) -> StringInstall
Download zipStrict JSON parsing and deterministic JSON canonicalization for MoonBit.
Dependencies