jsoncanvas 0.1.6

Library for creating and manipulating jsoncanvas data
Documentation
//! # jsoncanvas
//!
//! `jsoncanvas` is a library for creating and manipulating JSON objects representing a canvas.
//!
//! Specification source: <https://jsoncanvas.org/>
//!
//! ## Example
//!
//! ```
//! use jsoncanvas::JsonCanvas;
//! let s: String = "{\"nodes\":[{\"id\":\"id7\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"background\":\"path/to/image.png\",\"type\":\"group\"},{\"id\":\"id5\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"color\":\"#ff0000\",\"label\":\"Label\",\"type\":\"group\"},{\"id\":\"id2\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"color\":\"1\",\"file\":\"dir/to/path/file.png\",\"type\":\"file\"},{\"id\":\"id4\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"color\":\"1\",\"url\":\"https://www.google.com\",\"type\":\"link\"},{\"id\":\"id6\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"type\":\"group\"},{\"id\":\"id3\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"color\":\"1\",\"file\":\"dir/to/path/file.png\",\"subpath\":\"#here\",\"type\":\"file\"},{\"id\":\"id8\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"background\":\"path/to/image.png\",\"backgroundStyle\":\"cover\",\"type\":\"group\"},{\"id\":\"id\",\"x\":0,\"y\":0,\"width\":100,\"height\":100,\"color\":\"1\",\"text\":\"Test\",\"type\":\"text\"}],\"edges\":[{\"id\":\"edge2\",\"fromNode\":\"node3\",\"toNode\":\"node4\",\"color\":\"5\",\"label\":\"edge label\",\"toSide\":\"left\",\"toEnd\":\"arrow\"},{\"id\":\"edge1\",\"fromNode\":\"node1\",\"toNode\":\"node2\",\"toSide\":\"left\",\"toEnd\":\"arrow\"}]}".to_string();
//! let canvas: JsonCanvas = s.parse().unwrap();
//!
//! let _s = canvas.to_string();
//! ```
//!
//! ## Complete example
//!
//! ```
//!    use hex_color::HexColor;
//!    use jsoncanvas::color::{Color, PresetColor};
//!    use jsoncanvas::edge::{Edge, End, Side};
//!    use jsoncanvas::node::{
//!        Background, BackgroundStyle, FileNode, GroupNode, LinkNode, Node, TextNode,
//!    };
//!    use jsoncanvas::JsonCanvas;
//!    use std::path::PathBuf;
//!    use url::Url;
//!
//!    // Color
//!    let color1 = Color::Preset(PresetColor::Red);
//!    let color2 = Color::Color(HexColor::parse("#ff0000").unwrap());
//!
//!    let serialized_color1 = serde_json::to_string(&color1).unwrap();
//!    let serialized_color2 = serde_json::to_string(&color2).unwrap();
//!
//!    println!("serialized1 = {}", serialized_color1);
//!    println!("serialized2 = {}", serialized_color2);
//!
//!    // Text Node
//!    let node1: Node = Node::Text(TextNode::new(
//!        "id".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        Some(Color::Preset(PresetColor::Red)),
//!        "This is a test".to_string(),
//!    ));
//!
//!    // File Node
//!    let node2: Node = Node::File(FileNode::new(
//!        "id2".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        Some(Color::Preset(PresetColor::Red)),
//!        PathBuf::from("dir/to/path/file.png"),
//!        None,
//!    ));
//!    let node3: Node = Node::File(FileNode::new(
//!        "id3".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        Some(color1),
//!        PathBuf::from("dir/to/path/file.png"),
//!        Some("#here".parse().unwrap()),
//!    ));
//!
//!    // Link Node
//!    let node4: Node = Node::Link(LinkNode::new(
//!        "id4".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        Some(Color::Preset(PresetColor::Red)),
//!        Url::parse("https://julienduroure.com").unwrap(),
//!    ));
//!
//!    // Group Node
//!    let node5: Node = Node::Group(GroupNode::new(
//!        "id5".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        Some(color2),
//!        Some("Label".to_string()),
//!        None,
//!    ));
//!    let node6: Node = Node::Group(GroupNode::new(
//!        "id6".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        None,
//!        None,
//!        None,
//!    ));
//!    let node7: Node = Node::Group(GroupNode::new(
//!        "id7".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        None,
//!        None,
//!        Some(Background::new(PathBuf::from("path/to/image.png"), None)),
//!    ));
//!    let node8: Node = Node::Group(GroupNode::new(
//!        "id8".parse().unwrap(),
//!        0,
//!        0,
//!        100,
//!        100,
//!        None,
//!        None,
//!        Some(Background::new(
//!            PathBuf::from("path/to/image.png"),
//!            Some(BackgroundStyle::Cover),
//!        )),
//!    ));
//!
//!    let serialized_node1: String = serde_json::to_string(&node1).unwrap();
//!    let serialized_node2 = serde_json::to_string(&node2).unwrap();
//!    let serialized_node3 = serde_json::to_string(&node3).unwrap();
//!    let serialized_node4 = serde_json::to_string(&node4).unwrap();
//!    let serialized_node5 = serde_json::to_string(&node5).unwrap();
//!    let serialized_node6 = serde_json::to_string(&node6).unwrap();
//!    let serialized_node7 = serde_json::to_string(&node7).unwrap();
//!    let serialized_node8 = serde_json::to_string(&node8).unwrap();
//!
//!    println!("serialized node 1= {}", serialized_node1);
//!    println!("serialized node 2= {}", serialized_node2);
//!    println!("serialized node 3= {}", serialized_node3);
//!    println!("serialized node 4= {}", serialized_node4);
//!    println!("serialized node 5= {}", serialized_node5);
//!    println!("serialized node 6= {}", serialized_node6);
//!    println!("serialized node 7= {}", serialized_node7);
//!    println!("serialized node 8= {}", serialized_node8);
//!
//!    // Edge
//!
//!    let edge1 = Edge::new(
//!        "edge1".parse().unwrap(),
//!        "id".parse().unwrap(),
//!        None,
//!        None,
//!        "id2".parse().unwrap(),
//!        Some(Side::Left),
//!        Some(End::Arrow),
//!        None,
//!        None,
//!    );
//!    let edge2 = Edge::new(
//!        "edge2".parse().unwrap(),
//!        "id3".parse().unwrap(),
//!        None,
//!        None,
//!        "id4".parse().unwrap(),
//!        Some(Side::Left),
//!        Some(End::Arrow),
//!        Some(Color::Preset(PresetColor::Cyan)),
//!        Some("edge label".to_string()),
//!    );
//!
//!    let serialized_edge1 = serde_json::to_string(&edge1).unwrap();
//!    let serialized_edge2 = serde_json::to_string(&edge2).unwrap();
//!
//!    println!("serialized edge 1= {}", serialized_edge1);
//!    println!("serialized edge 2= {}", serialized_edge2);
//!
//!    // JSON Canvas
//!    let mut canvas = JsonCanvas::default();
//!
//!    let empty_canvas = canvas.to_string();
//!    println!("empty canvas = {}", empty_canvas);
//!    canvas = empty_canvas.parse().unwrap();
//!
//!    canvas.add_node(node1).unwrap();
//!    canvas.add_node(node2).unwrap();
//!    canvas.add_node(node3).unwrap();
//!    canvas.add_node(node4).unwrap();
//!    canvas.add_node(node5).unwrap();
//!    canvas.add_node(node6).unwrap();
//!    canvas.add_node(node7).unwrap();
//!    canvas.add_node(node8).unwrap();
//!
//!    canvas.add_edge(edge1).unwrap();
//!    canvas.add_edge(edge2).unwrap();
//!
//!    let serialized_canvas = canvas.to_string();
//!
//!    println!("serialized canvas = {}", serialized_canvas);
//!
//!    let jsoncanvas_deserialized: JsonCanvas = serialized_canvas.parse().unwrap();
//!    println!("deserialized canvas = {:?}", jsoncanvas_deserialized);
//! ```
//!
//! ## Available structs
//!
//! ```
//! use hex_color::HexColor;
//! use jsoncanvas::color::{Color, PresetColor};
//! use jsoncanvas::edge::{Edge, End, Side};
//! use jsoncanvas::node::{
//!     Background, BackgroundStyle, FileNode, GroupNode, LinkNode, Node, TextNode,
//! };
//! use jsoncanvas::JsonCanvas;
//! use std::path::PathBuf;
//! use url::Url;
//! ```

// pub type NodeId = String;
// pub type EdgeId = String;
pub type PixelCoordinate = i64;
pub type PixelDimension = u64;

pub mod color;
pub mod edge;
mod id;
pub mod jsoncanvas;
pub mod node;

pub use id::{EdgeId, NodeId};
pub use jsoncanvas::JsonCanvas;
pub use jsoncanvas::JsonCanvasError;
pub use node::{Background, BackgroundStyle, FileNode, GroupNode, LinkNode, Node, TextNode};

#[cfg(test)]
mod test {
    use hex_color::HexColor;

    #[test]
    fn test() {
        use super::color::{Color, PresetColor};
        use super::edge::{Edge, End, Side};
        use super::jsoncanvas::JsonCanvas;
        use super::node::{
            Background, BackgroundStyle, FileNode, GroupNode, LinkNode, Node, TextNode,
        };
        use std::path::PathBuf;
        use url::Url;

        // Color
        let color1 = Color::Preset(PresetColor::Red);
        let color2 = Color::Color(HexColor::parse("#ff0000").unwrap());

        // Text Node
        let node1: Node = TextNode::new(
            "id".parse().unwrap(),
            0,
            0,
            100,
            100,
            Some(Color::Preset(PresetColor::Red)),
            "This is a test".to_string(),
        )
        .into();

        // File Node
        let node2: Node = FileNode::new(
            "id2".parse().unwrap(),
            0,
            0,
            100,
            100,
            Some(Color::Preset(PresetColor::Red)),
            PathBuf::from("dir/to/path/file.png"),
            None,
        )
        .into();
        let node3: Node = FileNode::new(
            "id3".parse().unwrap(),
            0,
            0,
            100,
            100,
            Some(color1),
            PathBuf::from("dir/to/path/file.png"),
            Some("#here".to_string()),
        )
        .into();

        // Link Node
        let node4: Node = LinkNode::new(
            "id4".parse().unwrap(),
            0,
            0,
            100,
            100,
            Some(Color::Preset(PresetColor::Red)),
            Url::parse("https://julienduroure.com").unwrap(),
        )
        .into();

        // Group Node
        let node5: Node = GroupNode::new(
            "id5".parse().unwrap(),
            0,
            0,
            100,
            100,
            Some(color2),
            Some("Label".to_string()),
            None,
        )
        .into();
        let node6: Node =
            GroupNode::new("id6".parse().unwrap(), 0, 0, 100, 100, None, None, None).into();
        let node7: Node = GroupNode::new(
            "id7".parse().unwrap(),
            0,
            0,
            100,
            100,
            None,
            None,
            Some(Background::new(PathBuf::from("path/to/image.png"), None)),
        )
        .into();
        let node8: Node = GroupNode::new(
            "id8".parse().unwrap(),
            0,
            0,
            100,
            100,
            None,
            None,
            Some(Background::new(
                PathBuf::from("path/to/image.png"),
                Some(BackgroundStyle::Cover),
            )),
        )
        .into();

        // Edge

        let edge1 = Edge::new(
            "edge1".parse().unwrap(),
            "id".parse().unwrap(),
            None,
            None,
            "id2".parse().unwrap(),
            Some(Side::Left),
            Some(End::Arrow),
            None,
            None,
        );
        let edge2 = Edge::new(
            "edge2".parse().unwrap(),
            "id3".parse().unwrap(),
            None,
            None,
            "id4".parse().unwrap(),
            Some(Side::Left),
            Some(End::Arrow),
            Some(Color::Preset(PresetColor::Cyan)),
            Some("edge label".to_string()),
        );

        // JSON Canvas
        let mut canvas = JsonCanvas::default();
        canvas.add_node(node1).unwrap();
        canvas.add_node(node2).unwrap();
        canvas.add_node(node3).unwrap();
        canvas.add_node(node4).unwrap();
        canvas.add_node(node5).unwrap();
        canvas.add_node(node6).unwrap();
        canvas.add_node(node7).unwrap();
        canvas.add_node(node8).unwrap();

        canvas.add_edge(edge1).unwrap();
        canvas.add_edge(edge2).unwrap();

        let serialized_canvas = canvas.to_string();

        println!("serialized canvas = {}", serialized_canvas);

        ///////////////////////////// Deserialization /////////////////////////////

        // let deserialized_node1: Node = serde_json::from_str(&serialized_node1).unwrap();
        // println!("deserialized node 1= {:?}", deserialized_node1);

        // let deseralied_edge1: Edge = serde_json::from_str(&serialized_edge1).unwrap();
        // println!("deserialized edge 1= {:?}", deseralied_edge1);

        let _jsoncanvas_deserialized: JsonCanvas = serialized_canvas.parse().unwrap();
    }
}