#![doc(html_root_url = "https://docs.rs/dotavious/0.1.0")]
#![cfg_attr(docsrs, deny(broken_intra_doc_links))]
//! Dotavious provides bindings to generate [DOT](https://graphviz.org/doc/info/lang.html)
//! code used by the Graphviz (http://graphviz.org/) for visualising graphs.
//! Provides strongly typed attribute functions and offers almost complete
//! coverage of all Graphviz attributes and syntax
//!
//! # Examples
//!
//! First example provides a basic directed graph:
//! 2 nodes connected by a single edge
//!
//! ```rust
//! use dotavious::{Dot, Edge, Graph, GraphBuilder, Node};
//! use std::io;
//! use std::io::Read;
//!
//! let g = GraphBuilder::new_directed(Some("example".to_string()))
//! .add_node(Node::new("N0".to_string()))
//! .add_node(Node::new("N1".to_string()))
//! .add_edge(Edge::new("N0".to_string(), "N1".to_string()))
//! .build();
//!
//! let mut writer= Vec::new();
//! let dot = Dot { graph: g };
//! dot.render(&mut writer).unwrap();
//!
//! // output to graphviz DOT formatted string
//! let mut dot_string = String::new();
//! Read::read_to_string(&mut &*writer, &mut dot_string).unwrap();
//! println!("{}", dot_string);
//! ```
//! Produces
//! ```dot
//! digraph example {
//! N0;
//! N1;
//! N0 -> N1;
//! }
//! ```
//!
//! Second example provides a more complex graph showcasing
//! Dotavious' various builders and strongly typed attribute
//! functions.
//!
//! ```rust
//! use dotavious::attributes::{
//! AttributeText, Color, CompassPoint, EdgeAttributes, EdgeStyle, GraphAttributeStatementBuilder,
//! GraphAttributes, NodeAttributes, NodeStyle, PortPosition, RankDir, Shape,
//! };
//! use dotavious::{
//! Dot, Edge, EdgeAttributeStatementBuilder, EdgeBuilder, Graph,
//! GraphBuilder, Node, NodeAttributeStatementBuilder, NodeBuilder,
//! };
//! use std::io;
//! use std::io::Read;
//! ```
//!
//! Produces
//! ```dot
//!
//! ```
pub mod attributes;
pub mod dot;
#[doc(hidden)]
pub use crate::dot::{
Dot, DotString, Edge, EdgeAttributeStatementBuilder, EdgeBuilder, Graph,
GraphBuilder, Node, NodeAttributeStatementBuilder, NodeBuilder,
};
// TODO: support adding edge based on index of nodes?
// TODO: handle render options
// TODO: explicit attribute methods with type safety and enforce constraints
// i'm thinking we have NodeTraits/GraphTraits/EdgeTraits (what about none? is that a graph trait?)
// which will have default methods that use an associated type field called "state" or "attributes" etc
// TODO: implement Clone for Graph
// TODO: see if we can get any insights from Haskell implementation
// https://hackage.haskell.org/package/graphviz-2999.20.1.0/docs/Data-GraphViz-Attributes-Complete.html#t:Point
// - I like this: A summary of known current constraints/limitations/differences:
// Add a DPoint enum?
// /// Either a Double or a (2D) Point (i.e. created with Point::new_2d).
// pub enum DPoint {
// Double(f32),
// Point(Point),
// }