pub enum StringSkeletonNode {
Dispatch {
name: String,
ordering: Option<SubBranchOrdering>,
children: HashMap<String, DispatchChildSpec>,
},
LeafHolder {
name: String,
ordering: Option<SubBranchOrdering>,
n_leaves: u8,
capstone: bool,
},
Aggregate {
name: String,
ordering: Option<SubBranchOrdering>,
children: HashMap<String, AggregateChildSpec>,
},
}
Expand description
Set this object to configure a single node in the string skeleton, tagged by its role.
Note that we do not want the names of our nodes to be trivial or vague categories like “foundations”, or to use arbitrary separations like “beginner”, “intermediate”, “advanced”.
It is always better for us to slice the chosen topic into concrete subcomponents that bear physical meaning. In the case of lockpicking, for example, we could write categories for types of locks, types of equipment, and techniques for entry.
Categorizing into these three would be better than categorizing into “beginner skills”, “intermediate skills”, and “advanced skills”, for example. This same concept applies everywhere.
The essential idea is that the chosen names should refer to concrete subcomponents bearing physical meaning.
Variants§
Dispatch
Select this variant at this position in the model to emit a Dispatch
node in which each dispatch branch wraps a whole rooted subtree.
Note that each Dispatch node should always have greater than one child.
Fields
name: String
Set this field to indicate the official-name of this tree node.
IMPORTANT: All names should be UpperCamelCase and contain no spaces and no punctuation.
MORE IMPORTANTLY: DO NOT NAME THIS FIELD ANY TEMPORARY OR ANY GENERIC NAME!
Do not use names like SomethingDispatch
, Dispatch1
, DispatchNode1
, or anything like that!!! real names only!
Do not reveal the underlying structure of our tree growing algorithm by your choice of name!
WE DO NOT want to have to keep on asking you! name the tree nodes properly!!
Each name should have concrete physical value and stand on its own, independently of our tree and retain technical and structural significance OUTSIDE THE CONTEXT OF THE TREE GROWING PROCESS!!!!!!!!
ordering: Option<SubBranchOrdering>
Set the ordering
field to indicate an (optional) sub-branch ordering hint for our dispatch branch sequencing
children: HashMap<String, DispatchChildSpec>
Set the members of the children
map to specify official names for each dispatch-branch-rooted child node and their associated auxiliary specifications.
Keys in this map are the official names of the child nodes. Values are their associated DispatchChildSpec aux specifications.
LeafHolder
Select this variant to emit a LeafHolder
node at this tree location.
A LeafHolder node is like the shell of an enum with unit variants only.
LeafHolder
nodes are typically used as the “end-effectors” within the context of a domain model.
LeafHolder
nodes each have an associated number of “leaves” representing the number of ways this end effector can manifest in practice.
Fields
name: String
Set this field to indicate the official-name of this tree node.
IMPORTANT: All names should be UpperCamelCase identifiers and contain no spaces and no punctuation.
MORE IMPORTANTLY: DO NOT NAME THIS FIELD ANY TEMPORARY OR ANY GENERIC NAME!
Do not use names like SomethingLeaf
, Leaf1
, Leaf1A
, LeafBranch12
, LeafHolder9B
or anything like that!!! real names only!
Do not reveal the underlying structure of our tree growing algorithm by your choice of name!
THIS INSTRUCTION IS NOT OPTIONAL! We DO NOT WANT to ask again!
Correcting this problem after-the-fact is incredibly tedious! PLEASE PLEASE FOR THE LOVE OF GOD name the tree nodes properly!!
Each name should have concrete physical value and stand on its own, independently of our tree and retain technical and structural significance OUTSIDE THE CONTEXT OF THE TREE GROWING PROCESS!!!!!!!!
ordering: Option<SubBranchOrdering>
Set the ordering
field to indicate an (optional) branch-ordering hint for the LeafHolder leaves
Aggregate
Select the Aggregate
variant to emit a structure aggregating several downstream branches.
An Aggregate node should have at least 3 children. 3-7 is typical. More than 7 is possible where useful.
We use Aggregate
nodes to model components having children that always activate together (ie branches that are always taken simultaneously within the domain model path flow)
We model them as Aggregate nodes even if some of their branches may be temporarily deselected and are considered optional.
Aggregate
nodes are analogous to struct data.
Note that each Aggregate node should always have greater than one child.
We use Aggregate
for nodes whose children temporally or structurally overlap during simulation and Dispatch
for nodes whose children are more akin to mutually exclusive variations or alternatives.
Fields
name: String
Set this field to indicate the official-name of this Aggregate node.
IMPORTANT: All names should be UpperCamelCase and contain no spaces and no punctuation.
MORE IMPORTANTLY: DO NOT NAME THIS FIELD ANY TEMPORARY OR ANY GENERIC NAME!
Do not use names like SomethingAggregator
, Agg1
, AggNode1A
, MyAgg
or anything like that!!! real names only!
Do not reveal the underlying structure of our tree growing algorithm by your choice of name!
THIS INSTRUCTION IS NOT OPTIONAL! We DO NOT WANT to ask again! correcting this problem after-the-fact is incredibly tedious! PLEASE name the tree nodes properly!!
Each name should have concrete physical value and stand on its own, independently of our tree and retain technical and structural significance OUTSIDE THE CONTEXT OF THE TREE GROWING PROCESS!!!!!!!!
ordering: Option<SubBranchOrdering>
Set the ordering
field to indicate an (optional) branch-ordering hint for the Aggregate node fields
children: HashMap<String, AggregateChildSpec>
Set the members of the children
map to specify official names for each aggregate-branch-rooted child node and their associated auxiliary specifications.
Keys in this map are the official names of the direct child nodes. Values in this map are their associated AggregateChildSpec aux specifications.
Trait Implementations§
Source§impl AiJsonTemplate for StringSkeletonNode
impl AiJsonTemplate for StringSkeletonNode
Source§fn to_template() -> Value
fn to_template() -> Value
Source§impl Clone for StringSkeletonNode
impl Clone for StringSkeletonNode
Source§fn clone(&self) -> StringSkeletonNode
fn clone(&self) -> StringSkeletonNode
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for StringSkeletonNode
impl Debug for StringSkeletonNode
Source§impl Default for StringSkeletonNode
impl Default for StringSkeletonNode
Source§impl<'de> Deserialize<'de> for StringSkeletonNode
impl<'de> Deserialize<'de> for StringSkeletonNode
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl From<JustifiedStringSkeletonNode> for StringSkeletonNode
impl From<JustifiedStringSkeletonNode> for StringSkeletonNode
Source§fn from(value: JustifiedStringSkeletonNode) -> Self
fn from(value: JustifiedStringSkeletonNode) -> Self
Source§impl LoadFromFile for StringSkeletonNodewhere
StringSkeletonNode: for<'de> Deserialize<'de>,
impl LoadFromFile for StringSkeletonNodewhere
StringSkeletonNode: for<'de> Deserialize<'de>,
Source§impl PartialEq for StringSkeletonNode
impl PartialEq for StringSkeletonNode
Source§impl SaveToFile for StringSkeletonNodewhere
StringSkeletonNode: Serialize,
impl SaveToFile for StringSkeletonNodewhere
StringSkeletonNode: Serialize,
Source§impl Serialize for StringSkeletonNode
impl Serialize for StringSkeletonNode
impl Eq for StringSkeletonNode
impl StructuralPartialEq for StringSkeletonNode
Auto Trait Implementations§
impl Freeze for StringSkeletonNode
impl RefUnwindSafe for StringSkeletonNode
impl Send for StringSkeletonNode
impl Sync for StringSkeletonNode
impl Unpin for StringSkeletonNode
impl UnwindSafe for StringSkeletonNode
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> LoadFromDirectory for Twhere
T: LoadFromFile + Send,
<T as LoadFromFile>::Error: Display + From<SaveLoadError> + From<Error> + Send + 'static,
impl<T> LoadFromDirectory for Twhere
T: LoadFromFile + Send,
<T as LoadFromFile>::Error: Display + From<SaveLoadError> + From<Error> + Send + 'static,
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);