summaryrefslogtreecommitdiffstats
path: root/src/segment.rs
diff options
context:
space:
mode:
authorMatan Kushner <hello@matchai.me>2019-04-12 17:49:20 -0400
committerMatan Kushner <hello@matchai.me>2019-04-12 17:49:20 -0400
commitd82ebc4457adefcd9ad45c4d3d6d611c28d80cc3 (patch)
tree1b110727e2857bb3101ffd60ab8b881eb5c2cdc5 /src/segment.rs
parent7356faaec2cdb99abd662f33d716ab6387d4f48f (diff)
Add builder pattern for segment
Diffstat (limited to 'src/segment.rs')
-rw-r--r--src/segment.rs83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/segment.rs b/src/segment.rs
new file mode 100644
index 000000000..df3017628
--- /dev/null
+++ b/src/segment.rs
@@ -0,0 +1,83 @@
+use ansi_term::Style;
+
+pub struct Segment {
+ name: Option<String>,
+ style: Style,
+ value: String,
+ prefix: OptionalSegment,
+ suffix: OptionalSegment,
+}
+
+impl Segment {
+ pub fn new<S>(name: S) -> Segment where S: Into<String> {
+ let default_prefix = Some(Box::new(Segment {
+ name: Some(format!("{} {}", name.into(), "prefix")),
+ style: Style::default(),
+ value: String::from("via "),
+ prefix: None,
+ suffix: None,
+ }));
+
+ let default_suffix = Some(Box::new(Segment {
+ name: Some(format!("{} {}", name.into(), "suffix")),
+ style: Style::default(),
+ value: String::from(" "),
+ prefix: None,
+ suffix: None,
+ }));
+
+ Segment {
+ name: Some(name.into()),
+ style: Style::default(),
+ value: String::from(""),
+ prefix: default_prefix,
+ suffix: default_suffix,
+ }
+ }
+
+ pub fn set_style<'a>(&'a mut self, style: Style) -> &'a mut Segment {
+ self.style = style;
+ self
+ }
+
+ pub fn set_value<'a>(&'a mut self, value: String) -> &'a mut Segment {
+ self.value = value;
+ self
+ }
+
+ pub fn set_prefix<'a>(&'a mut self, prefix: Segment) -> &'a mut Segment {
+ self.prefix = Some(Box::new(prefix));
+ self
+ }
+
+ pub fn set_suffix<'a>(&'a mut self, suffix: Segment) -> &'a mut Segment {
+ self.suffix = Some(Box::new(suffix));
+ self
+ }
+
+ pub fn output<'a>(&'a self) -> String {
+ let Segment {
+ name: _name,
+ prefix,
+ value,
+ style,
+ suffix,
+ } = self;
+
+ let mut segment_string = String::new();
+
+ if let Some(prefix) = prefix {
+ segment_string += &prefix.output()
+ }
+
+ segment_string += &style.paint(value).to_string();
+
+ if let Some(suffix) = suffix {
+ segment_string += &suffix.output();
+ }
+
+ segment_string
+ }
+}
+
+type OptionalSegment = Option<Box<Segment>>;