1
2use std::fmt::Display;
3use std::marker::PhantomData;
4use std::fmt;
5use std::fmt::Arguments;
6use std::io::Write;
7use std::io;
8use cluColor;
9
10#[allow(non_camel_case_types)]
12#[derive(Debug, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
13pub struct cluColorWriter<C: cluColor>(PhantomData<C>);
14
15impl<C: cluColor> cluColorWriter<C> {
16 #[inline]
17 pub fn new() -> Self {
18 cluColorWriter(PhantomData)
19 }
20
21 #[inline(always)]
22 pub fn raw_color<'a>(&self) -> &'a str {
23 C::raw_color()
24 }
25
26 #[inline(always)]
27 pub fn raw_color_b<'a>(&self) -> &'a [u8] {
28 C::raw_color_b()
29 }
30
31 #[inline(always)]
32 pub fn name<'a>(&self) -> &'a str {
33 C::name()
34 }
35
36 #[inline(always)]
37 pub fn write<'a, W: Write>(&self, w: W, buf: &'a [u8]) -> io::Result<()> {
38 C::write(w, buf)
39 }
40
41 #[inline(always)]
42 pub fn write_str<'a, W: Write>(&self, w: W, str: &'a str) -> io::Result<()> {
43 C::write_str(w, str)
44 }
45
46 #[inline(always)]
47 pub fn write_fmt<'a, W: Write>(&self, w: W, fmt: Arguments<'a>) -> io::Result<()> {
48 C::write_fmt(w, fmt)
49 }
50
51 #[inline(always)]
54 pub fn writen<'a, W: Write>(&self, w: W, buf: &'a [u8]) -> io::Result<()> {
55 C::writen(w, buf)
56 }
57
58 #[inline(always)]
59 pub fn writen_str<'a, W: Write>(&self, w: W, str: &'a str) -> io::Result<()> {
60 C::writen_str(w, str)
61 }
62
63 #[inline(always)]
64 pub fn writen_fmt<'a, W: Write>(&self, w: W, fmt: Arguments<'a>) -> io::Result<()> {
65 C::writen_fmt(w, fmt)
66 }
67
68
69 #[inline(always)]
70 pub fn string_as<'a, A: AsRef<str>>(&self, asref: A) -> String {
71 C::string(asref.as_ref())
72 }
73
74 #[inline(always)]
75 pub fn stringn_as<'a, A: AsRef<str>>(&self, asref: A) -> String {
76 C::stringn(asref.as_ref())
77 }
78
79 #[inline(always)]
80 pub fn string<'a>(&self, str: &'a str) -> String {
81 C::string(str)
82 }
83
84 #[inline(always)]
85 pub fn string_fmt<'a>(&self, fmt: Arguments<'a>) -> String {
86 C::string_fmt(fmt)
87 }
88
89
90 #[inline(always)]
91 pub fn stringn<'a>(&self, str: &'a str) -> String {
92 C::stringn(str)
93 }
94
95 #[inline(always)]
96 pub fn stringn_fmt<'a>(&self, fmt: Arguments<'a>) -> String {
97 C::stringn_fmt(fmt)
98 }
99}
100
101
102
103impl<C: cluColor> Display for cluColorWriter<C> {
104 #[inline]
105 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
106 write!(f, "{}", self.name())
107 }
108}
109
110
111
112impl<'l, T: cluColor> cluColor for cluColorWriter<T> {
113 #[inline(always)]
114 fn raw_color<'a>() -> &'a str { T::raw_color() }
115
116 #[inline(always)]
117 fn raw_color_b<'a>() -> &'a [u8] { T::raw_color_b() }
118
119 #[inline(always)]
120 fn name<'a>() -> &'a str { T::name() }
121
122
123 #[inline(always)]
124 fn writer() -> cluColorWriter<Self> where Self: Sized { cluColorWriter::<Self>::new() }
125
126
127 #[inline(always)]
128 fn string_as<'a, A: AsRef<str>>(asref: A) -> String { T::string_as(asref) }
129
130 #[inline(always)]
131 fn stringn_as<'a, A: AsRef<str>>(asref: A) -> String { T::stringn_as(asref) }
132
133 #[inline(always)]
134 fn string_fmt<'a>(fmt: Arguments<'a>) -> String { T::string_fmt(fmt) }
135
136 #[inline(always)]
137 fn string<'a>(str: &'a str) -> String { T::string(str) }
138
139 #[inline(always)]
140 fn stringn<'a>(str: &'a str) -> String { T::stringn(str) }
141
142 #[inline(always)]
143 fn stringn_fmt<'a>(fmt: Arguments<'a>) -> String { T::stringn_fmt(fmt) }
144
145 #[inline(always)]
146 fn write_as<'a, W: Write, A: AsRef<[u8]>>(w: W, asref: A) -> io::Result<()> { T::write_as(w, asref) }
147
148 #[inline(always)]
149 fn writen_as<'a, W: Write, A: AsRef<[u8]>>(w: W, asref: A) -> io::Result<()> { T::writen_as(w, asref) }
150
151 #[inline(always)]
152 fn write<'a, W: Write>(w: W, array: &'a [u8]) -> io::Result<()> { T::write(w, array) }
153
154 #[inline(always)]
155 fn write_str<'a, W: Write>(w: W, str: &'a str) -> io::Result<()> { T::write_str(w, str) }
156
157 #[inline(always)]
158 fn write_fmt<'a, W: Write>(w: W, fmt: Arguments<'a>) -> io::Result<()> { T::write_fmt(w, fmt) }
159
160 #[inline(always)]
161 fn writen<'a, W: Write>(w: W, array: &'a [u8]) -> io::Result<()> { T::writen(w, array) }
162
163 #[inline(always)]
164 fn writen_str<'a, W: Write>(w: W, str: &'a str) -> io::Result<()> { T::writen_str(w, str) }
165
166 #[inline(always)]
167 fn writen_fmt<'a, W: Write>(w: W, fmt: Arguments<'a>) -> io::Result<()> { T::writen_fmt(w, fmt) }
168
169 #[inline(always)]
170 fn with_color_fmt<'a, F: Fn(&Arguments) -> C, C: 'a>(args: Arguments<'a>, function: F) -> C { T::with_color_fmt(args, function) }
171
172 #[inline(always)]
173 fn once_with_color_fmt<'a, F: FnOnce(&Arguments) -> C, C: 'a>(args: Arguments<'a>, function: F) -> C { T::once_with_color_fmt(args, function) }
174
175 #[inline(always)]
176 fn mut_with_color_fmt<'a, F: FnMut(&Arguments) -> C, C: 'a>(args: Arguments<'a>, function: F) -> C { T::mut_with_color_fmt(args, function) }
177}