1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! # constants for dot options
//!
//! ## Example
//! ```
//! use net_ensembles::{*, rand::SeedableRng, dot_constants::*};
//! use rand_pcg::Pcg64;
//!
//! let rng = Pcg64::seed_from_u64(0);
//! let ensemble = ErEnsembleM::<EmptyNode, _>::new(10, 20, rng);
//!
//! // create dot
//! let dot = ensemble.graph().to_dot_with_labels_from_contained(
//!     dot_options!(TRANSPARENT_BG, NO_OVERLAP, SIZE_A4, RATIO_FILL),
//!     |_, index|
//!     {
//!         format!("Hey, I am at index: {}", index)
//!     }
//! );
//!
//! println!("{}", dot);
//! ```


/// You can chain/combine options with the `dot_options!` macro:
/// ```
/// use net_ensembles::dot_constants::*;
/// use net_ensembles::dot_options;
///
/// dot_options!(SPLINES, TRANSPARENT_BG, NO_OVERLAP, "fontsize=50;");
///
/// // Note, the macro is equivalent to
/// let chain = [SPLINES, TRANSPARENT_BG].join("\n\t");
///
/// assert!(chain == dot_options!(SPLINES, TRANSPARENT_BG) );
/// ```
#[macro_export]
macro_rules! dot_options {
    ( $( $x:expr ),* ) => {
        [ $( $x ),* ].join("\n\t")
    }
}

/// * Example options. You are free to use your own. Search for graphviz.
pub const EXAMPLE_DOT_OPTIONS: &str = "bgcolor=\"transparent\";\n\tfontsize=50;\n\t\
        node [shape=ellipse, penwidth=1, \
        fontname=\"Courier\", pin=true ];\n\tsplines=true;";

/// * activate splines
pub const SPLINES: &str = "splines=true;";

/// * use transparent background
pub const TRANSPARENT_BG: &str = "bgcolor=\"transparent\";";

/// * no overlapping nodes
pub const NO_OVERLAP: &str = "overlap=false;";

/// * Din A4 size
pub const SIZE_A4: &str = "size=\"8.3,11.7!\";";

/// * dot option: ratio="fill"
pub const RATIO_FILL: &str = "ratio=\"fill\";";

/// * do not use margin
pub const MARGIN_0: &str = "margin=0;";