1use std::ops::{
2 Add,
3 AddAssign
4};
5
6use crate::{
7 traits::Colourisable,
8 consts::Formatting,
9 strings::{
10 ColouredString,
11 ColouredStringPart
12 }
13};
14
15
16impl Colourisable for &str {
17 fn formatted(self, formatting : Vec<Formatting>) -> ColouredString {
18 return ColouredString::from_formatting(self, formatting);
19 }
20}
21impl Add<ColouredString> for &str {
22 type Output = ColouredString;
23 fn add(self, other : ColouredString) -> Self::Output {
24 let mut string = ColouredString::new();
25 string.parts = vec![
26 ColouredStringPart::String(self.to_string()),
27 ColouredStringPart::Sub(Box::new(other.formatted(Vec::new())))
28 ];
29 return string;
30 }
31}
32impl From<&str> for ColouredString {
33 fn from(string : &str) -> Self {
34 return string.formatted(Vec::new());
35 }
36}
37
38impl Colourisable for String {
39 fn formatted(self, formatting : Vec<Formatting>) -> ColouredString {
40 return ColouredString::from_formatting(self, formatting);
41 }
42}
43impl Add<ColouredString> for String {
44 type Output = ColouredString;
45 fn add(self, other : ColouredString) -> Self::Output {
46 let mut string = ColouredString::new();
47 string.parts = vec![
48 ColouredStringPart::String(self),
49 ColouredStringPart::Sub(Box::new(other.formatted(Vec::new())))
50 ];
51 return string;
52 }
53}
54impl Into<String> for ColouredString {
55 fn into(self) -> String {
56 return self.unformat();
57 }
58}
59impl From<String> for ColouredString {
60 fn from(string : String) -> Self {
61 return string.formatted(Vec::new());
62 }
63}
64
65impl Colourisable for char {
66 fn formatted(self, formatting : Vec<Formatting>) -> ColouredString {
67 return ColouredString::from_formatting(self, formatting);
68 }
69}
70impl Add<ColouredString> for char {
71 type Output = ColouredString;
72 fn add(self, other : ColouredString) -> Self::Output {
73 let mut string = ColouredString::new();
74 string.parts = vec![
75 ColouredStringPart::String(self.to_string()),
76 ColouredStringPart::Sub(Box::new(other.formatted(Vec::new())))
77 ];
78 return string;
79 }
80}
81impl From<char> for ColouredString {
82 fn from(ch : char) -> Self {
83 return ch.formatted(Vec::new());
84 }
85}
86
87impl Colourisable for ColouredString {
88 fn formatted(mut self, mut formatting : Vec<Formatting>) -> ColouredString {
89 formatting.append(&mut self.formatting);
90 self.formatting = formatting;
91 return self;
92 }
93}
94impl<S : Colourisable> Add<S> for ColouredString {
95 type Output = ColouredString;
96 fn add(self, other : S) -> Self::Output {
97 let mut string = ColouredString::new();
98 string.parts = vec![
99 ColouredStringPart::Sub(Box::new(self)),
100 ColouredStringPart::Sub(Box::new(other.formatted(Vec::new())))
101 ];
102 return string;
103 }
104}
105impl<S : Colourisable> AddAssign<S> for ColouredString {
106 fn add_assign(&mut self, other : S) {
107 self.parts.push(
108 ColouredStringPart::Sub(Box::new(other.formatted(Vec::new())))
109 );
110 }
111}