pushkin-compiler 0.2.1

Schema compiler for pushkin: canonical JSON Schema emission and generated bindings
Documentation
//! R7 regression coverage: hostile valid strings remain valid target literals.

use pushkin_compiler::{compile, CompileError, CompileRequest, Target};

const HOSTILE_SCHEMA: &str = r#"{
  "type":"object",
  "properties":{
    "defaulted":{"type":"string","default":"O'Brien\\draft\"quoted"},
    "choice":{"type":"string","enum":["O'Brien","C:\\temp","say \"hi\""]}
  },
  "required":["choice"],
  "additionalProperties":false
}"#;

fn compile_target(target: Target) -> Result<String, CompileError> {
    compile(&CompileRequest {
        contract_name: "hostile".to_owned(),
        schema_json: HOSTILE_SCHEMA.to_owned(),
        target,
        epoch: 1,
    })
    .map(|output| output.content)
}

#[test]
fn zod_escapes_string_defaults_and_enum_values() {
    let output = compile_target(Target::Zod).unwrap();
    assert!(
        output.contains(r#".default("O'Brien\\draft\"quoted")"#),
        "{output}"
    );
    assert!(output.contains(r#""C:\\temp""#), "{output}");
    assert!(output.contains(r#""say \"hi\"""#), "{output}");
}

#[test]
fn pydantic_escapes_string_defaults_and_enum_values() {
    let output = compile_target(Target::Pydantic).unwrap();
    assert!(
        output.contains(r#"default="O'Brien\\draft\"quoted""#),
        "{output}"
    );
    assert!(output.contains(r#""C:\\temp""#), "{output}");
    assert!(output.contains(r#""say \"hi\"""#), "{output}");
}

#[test]
fn rust_escapes_string_defaults_and_enum_values() {
    let output = compile_target(Target::Rust).unwrap();
    // Phase 6 task 2 ยง7 record: the approved typify swap spells the owned
    // conversion `.to_string()` (was `.to_owned()`); the pinned escaped
    // literal bytes are identical.
    assert!(
        output.contains(r#""O'Brien\\draft\"quoted".to_string()"#),
        "{output}"
    );
    assert!(
        output.contains(r#"#[serde(rename = "C:\\temp")]"#),
        "{output}"
    );
    assert!(
        output.contains(r#"#[serde(rename = "say \"hi\"")]"#),
        "{output}"
    );
}

#[test]
fn sql_escapes_string_defaults_and_enum_values() {
    let output = compile_target(Target::Sql).unwrap();
    assert!(
        output.contains(r#"DEFAULT 'O''Brien\draft"quoted'"#),
        "{output}"
    );
    assert!(output.contains("'O''Brien'"), "{output}");
    assert!(output.contains(r"'C:\temp'"), "{output}");
}