Skip to main content

sim_lib_agent_runner_core/
grammar.rs

1use sim_kernel::Result;
2use sim_shape::{Shape, shape_json_schema};
3
4/// Lowers a SIM `shape` into a constrained-decoding grammar string.
5///
6/// The grammar can be handed to a model runner to constrain generation to
7/// values that match `shape`.
8pub fn shape_to_grammar(shape: &dyn Shape) -> Result<String> {
9    shape_json_schema(shape)
10}
11
12#[cfg(test)]
13mod tests {
14    use super::shape_to_grammar;
15    use sim_kernel::Symbol;
16    use sim_shape::{ExprKind, ExprKindShape, FieldShape, FieldSpec, ListShape};
17    use std::sync::Arc;
18
19    #[test]
20    fn lowers_non_trivial_object_shape() {
21        let grammar = shape_to_grammar(&FieldShape::anonymous(vec![
22            FieldSpec::required(
23                Symbol::new("name"),
24                Arc::new(ExprKindShape::new(ExprKind::String)),
25            ),
26            FieldSpec::required(
27                Symbol::new("versions"),
28                Arc::new(ListShape::new(vec![
29                    Arc::new(ExprKindShape::new(ExprKind::String)),
30                    Arc::new(ExprKindShape::new(ExprKind::String)),
31                ])),
32            ),
33        ]))
34        .unwrap();
35
36        assert!(grammar.contains(r#""type":"object""#));
37        assert!(grammar.contains(r#""name":{"type":"string"}"#));
38        assert!(grammar.contains(r#""versions":{"type":"array""#));
39        assert!(grammar.contains(r#""additionalProperties":false"#));
40    }
41}