graphlang 0.1.3

Terminal and graphical tool to create and explore graph grammars.
Documentation
type Graph = graphlang::Graph<u32, String, ()>;
type GraphGrammar = graphlang::GraphGrammar<u32, String, ()>;

#[test]
fn read_graph_from_file() {
    let file = std::fs::File::open("tests/minimal.graph.json").unwrap();
    let reader = std::io::BufReader::new(file);
    let _g: Graph = serde_json::from_reader(reader).unwrap();
}

#[test]
fn serde_of_a_graphgrammar() {
    let gg: GraphGrammar = graphlang::predefined::ladder_grammar(3).into();
    let gg_ser = serde_json::to_string(&gg);
    assert!(gg_ser.is_ok());

    let gg_from_file: GraphGrammar = {
        let content = std::fs::read_to_string("tests/ladder_3.gg.json")
            .expect("ladder_3.gg.json is readable");
        serde_json::from_str(&content).expect("Deserialize json")
    };
    assert_eq!(gg, gg_from_file);
}

#[test]
fn graphgrammar_from_file_is_usable() {
    let gg: GraphGrammar = {
        let content = std::fs::read_to_string("tests/ladder_3.gg.json")
            .expect("ladder_3.gg.json is readable");
        serde_json::from_str(&content).expect("Deserialize json")
    };

    let mut graph = gg.start_graph.clone();
    for _ in 0..10 {
        gg.productions["extend"].apply_inplace(&mut graph);
    }
    gg.productions["finalize"].apply_inplace(&mut graph);

    assert!(gg.is_valid(&graph));
}