wellformed 0.1.0

Declarative form validation schemas with transforms, constraints, and codegen
Documentation
//! Interop tests for TypeScript-generated IR JSON

#[cfg(test)]
mod tests {
    use crate::ir::{
        Constraint, ErrorMeta, ObjectSchema, Predicate, Schema, StringSchema, Transform, TypeSchema,
    };

    /// JSON generated by TypeScript: w.object({ name: w.string().trim().minLen(1), age: w.integer().min(0) })
    /// Now uses flattened format matching Rust's serde structure
    const TS_GENERATED_SCHEMA: &str = r#"{
  "version": "1.0",
  "root": {
    "type": "object",
    "properties": {
      "name": {
        "type": "string",
        "transforms": [
          {
            "fn": "trim"
          }
        ],
        "constraints": [
          {
            "pred": {
              "type": "min_len",
              "len": 1
            },
            "error": {
              "code": "TOO_SHORT",
              "message": "Must be at least 1 characters",
              "severity": "error"
            }
          }
        ]
      },
      "age": {
        "type": "integer",
        "constraints": [
          {
            "pred": {
              "type": "range",
              "min": 0
            },
            "error": {
              "code": "OUT_OF_RANGE",
              "message": "Must be >= 0",
              "severity": "error"
            }
          }
        ]
      }
    }
  }
}"#;

    #[test]
    fn test_parse_ts_generated_schema() {
        let result: Result<Schema, _> = serde_json::from_str(TS_GENERATED_SCHEMA);
        match result {
            Ok(schema) => {
                println!("Successfully parsed TS schema: {:?}", schema);
            }
            Err(e) => {
                panic!("Failed to parse TS-generated schema: {}", e);
            }
        }
    }

    #[test]
    fn test_rust_schema_serialization() {
        // Create the equivalent schema in Rust
        let schema = Schema::new(
            "1.0",
            TypeSchema::Object(
                ObjectSchema::new()
                    .property(
                        "name",
                        TypeSchema::String(
                            StringSchema::new().transform(Transform::trim()).constraint(
                                Constraint::new(
                                    Predicate::min_len(1),
                                    ErrorMeta::new("TOO_SHORT", "Must be at least 1 characters"),
                                ),
                            ),
                        ),
                    )
                    .property("age", TypeSchema::integer()),
            ),
        );

        let json = serde_json::to_string_pretty(&schema).unwrap();
        println!("Rust-generated schema JSON:\n{}", json);
    }
}