diff --git a/mlf-cli/src/generate/mlf.rs b/mlf-cli/src/generate/mlf.rs index 5ce9845..39e75bf 100644 --- a/mlf-cli/src/generate/mlf.rs +++ b/mlf-cli/src/generate/mlf.rs @@ -827,12 +827,24 @@ fn generate_type( ) -> Result { let type_name = type_def.get("type").and_then(|v| v.as_str()); + // Primitive types that the ATProto spec defines with constraint fields + // are routed through `with_constraints`; it returns an atom when no + // constraint keys are present, so it's equally valid for inputs + // written without any. The spec permits: + // boolean — default, const + // integer — minimum, maximum, enum, default, const + // string — format, min/maxLength, min/maxGraphemes, knownValues, + // enum, default, const (via `render_string`) + // bytes — minLength, maxLength + // blob — accept, maxSize + // `null` and `unknown` have no defined constraint fields and stay + // atomic. match type_name { Some("null") => Ok(Rendered::atom("null")), - Some("boolean") => Ok(Rendered::atom("boolean")), + Some("boolean") => Ok(Rendered::with_constraints("boolean", type_def, indent_level)), Some("integer") => Ok(Rendered::with_constraints("integer", type_def, indent_level)), Some("string") => Ok(render_string(type_def, indent_level)), - Some("bytes") => Ok(Rendered::atom("bytes")), + Some("bytes") => Ok(Rendered::with_constraints("bytes", type_def, indent_level)), Some("blob") => Ok(Rendered::with_constraints("blob", type_def, indent_level)), Some("unknown") => Ok(Rendered::atom("unknown")), Some("array") => render_array(type_def, ctx, indent_level), diff --git a/tests/lexicon_to_mlf/all_constraint_keys/expected.mlf b/tests/lexicon_to_mlf/all_constraint_keys/expected.mlf index 9701f11..1860573 100644 --- a/tests/lexicon_to_mlf/all_constraint_keys/expected.mlf +++ b/tests/lexicon_to_mlf/all_constraint_keys/expected.mlf @@ -23,3 +23,16 @@ def type status = string constrained { default: "active", }; +def type blocked = boolean constrained { + const: true, +}; + +def type flag = boolean constrained { + default: false, +}; + +def type digest = bytes constrained { + minLength: 32, + maxLength: 64, +}; + diff --git a/tests/lexicon_to_mlf/all_constraint_keys/input.json b/tests/lexicon_to_mlf/all_constraint_keys/input.json index 1e00ffc..6c85f4f 100644 --- a/tests/lexicon_to_mlf/all_constraint_keys/input.json +++ b/tests/lexicon_to_mlf/all_constraint_keys/input.json @@ -26,6 +26,19 @@ "type": "string", "enum": ["active", "inactive"], "default": "active" + }, + "blocked": { + "type": "boolean", + "const": true + }, + "flag": { + "type": "boolean", + "default": false + }, + "digest": { + "type": "bytes", + "minLength": 32, + "maxLength": 64 } } }