1use std::io;
7use std::marker::PhantomData;
8use crate::captured::Captured;
9use crate::length::Length;
10use crate::mode::Mode;
11use crate::tag::Tag;
12
13
14pub trait Values {
28 fn encoded_len(&self, mode: Mode) -> usize;
30
31 fn write_encoded<W: io::Write>(
33 &self,
34 mode: Mode,
35 target: &mut W
36 ) -> Result<(), io::Error>;
37
38
39 fn explicit(self, tag: Tag) -> Constructed<Self>
43 where Self: Sized {
44 Constructed::new(tag, self)
45 }
46
47 fn to_captured(&self, mode: Mode) -> Captured {
49 let mut target = Vec::new();
50 self.write_encoded(mode, &mut target).unwrap();
51 Captured::new(target.into(), mode, Default::default())
52 }
53}
54
55
56impl<T: Values> Values for &'_ T {
59 fn encoded_len(&self, mode: Mode) -> usize {
60 (*self).encoded_len(mode)
61 }
62
63 fn write_encoded<W: io::Write>(
64 &self,
65 mode: Mode,
66 target: &mut W
67 ) -> Result<(), io::Error> {
68 (*self).write_encoded(mode, target)
69 }
70}
71
72
73macro_rules! tupl_impl {
86 ( tuple > ) => { };
88
89 ( tuple $t:ident $( $ttail:ident )* > $i:tt $( $itail:tt )* ) => {
92 impl<$t: Values, $( $ttail: Values ),*> Values
93 for ($t, $( $ttail ),*) {
94 fn encoded_len(&self, mode: Mode) -> usize {
95 self.$i.encoded_len(mode)
96 $(
97 + self.$itail.encoded_len(mode)
98 )*
99 }
100
101 fn write_encoded<W: io::Write>(
102 &self,
103 mode: Mode,
104 target: &mut W
105 ) -> Result<(), io::Error> {
106 tupl_impl!( write self, mode, target, $i $( $itail )* );
107 Ok(())
108 }
109 }
110
111 tupl_impl!(
112 tuple $($ttail)* > $($itail)*
113 );
114 };
115
116 ( write $self:expr, $mode:expr, $target:expr, ) => { };
118
119 ( write $self:expr, $mode:expr, $target:expr, $i:tt $($itail:tt)*) => {
121 tupl_impl!( write $self, $mode, $target, $($itail)* );
122 $self.$i.write_encoded($mode, $target)?
123 }
124}
125
126tupl_impl!(
129 tuple T11 T10 T9 T8 T7 T6 T5 T4 T3 T2 T1 T0 > 11 10 9 8 7 6 5 4 3 2 1 0
130);
131
132
133impl<V: Values> Values for Option<V> {
140 fn encoded_len(&self, mode: Mode) -> usize {
141 match self {
142 Some(v) => v.encoded_len(mode),
143 None => 0
144 }
145 }
146
147 fn write_encoded<W: io::Write>(
148 &self,
149 mode: Mode,
150 target: &mut W
151 ) -> Result<(), io::Error> {
152 match self {
153 Some(v) => v.write_encoded(mode, target),
154 None => Ok(())
155 }
156 }
157}
158
159
160impl<V: Values> Values for [V] {
163 fn encoded_len(&self, mode: Mode) -> usize {
164 self.iter().map(|v| v.encoded_len(mode)).sum()
165 }
166
167 fn write_encoded<W: io::Write>(&self, mode: Mode, target: &mut W)
168 -> Result<(), io::Error>
169 {
170 for i in self {
171 i.write_encoded(mode, target)?;
172 };
173 Ok(())
174 }
175}
176
177impl<V: Values> Values for Vec<V> {
178 fn encoded_len(&self, mode: Mode) -> usize {
179 self.iter().map(|v| v.encoded_len(mode)).sum()
180 }
181
182 fn write_encoded<W: io::Write>(&self, mode: Mode, target: &mut W)
183 -> Result<(), io::Error>
184 {
185 for i in self {
186 i.write_encoded(mode, target)?;
187 };
188 Ok(())
189 }
190}
191
192
193pub struct Constructed<V> {
197 tag: Tag,
199
200 inner: V,
202}
203
204impl<V> Constructed<V> {
205 pub fn new(tag: Tag, inner: V) -> Self {
210 Constructed { tag, inner }
211 }
212}
213
214impl<V: Values> Values for Constructed<V> {
215 fn encoded_len(&self, mode: Mode) -> usize {
216 let len = self.inner.encoded_len(mode);
217 let len = len + match mode {
218 Mode::Ber | Mode::Der => {
219 Length::Definite(len).encoded_len()
220 }
221 Mode::Cer => {
222 Length::Indefinite.encoded_len()
223 + EndOfValue.encoded_len(mode)
224 }
225 };
226 self.tag.encoded_len() + len
227 }
228
229 fn write_encoded<W: io::Write>(
230 &self,
231 mode: Mode,
232 target: &mut W
233 ) -> Result<(), io::Error> {
234 self.tag.write_encoded(true, target)?;
235 match mode {
236 Mode::Ber | Mode::Der => {
237 Length::Definite(self.inner.encoded_len(mode))
238 .write_encoded(target)?;
239 self.inner.write_encoded(mode, target)
240 }
241 Mode::Cer => {
242 Length::Indefinite.write_encoded(target)?;
243 self.inner.write_encoded(mode, target)?;
244 EndOfValue.write_encoded(mode, target)
245 }
246 }
247 }
248}
249
250
251pub enum Choice2<L, R> {
258 One(L),
260
261 Two(R)
263}
264
265impl<L: Values, R: Values> Values for Choice2<L, R> {
266 fn encoded_len(&self, mode: Mode) -> usize {
267 match *self {
268 Choice2::One(ref inner) => inner.encoded_len(mode),
269 Choice2::Two(ref inner) => inner.encoded_len(mode),
270 }
271 }
272
273 fn write_encoded<W: io::Write>(
274 &self,
275 mode: Mode,
276 target: &mut W
277 ) -> Result<(), io::Error> {
278 match *self {
279 Choice2::One(ref inner) => inner.write_encoded(mode, target),
280 Choice2::Two(ref inner) => inner.write_encoded(mode, target),
281 }
282 }
283}
284
285
286pub enum Choice3<L, C, R> {
293 One(L),
295
296 Two(C),
298
299 Three(R)
301}
302
303impl<L: Values, C: Values, R: Values> Values for Choice3<L, C, R> {
304 fn encoded_len(&self, mode: Mode) -> usize {
305 match *self {
306 Choice3::One(ref inner) => inner.encoded_len(mode),
307 Choice3::Two(ref inner) => inner.encoded_len(mode),
308 Choice3::Three(ref inner) => inner.encoded_len(mode),
309 }
310 }
311
312 fn write_encoded<W: io::Write>(
313 &self,
314 mode: Mode,
315 target: &mut W
316 ) -> Result<(), io::Error> {
317 match *self {
318 Choice3::One(ref inner) => inner.write_encoded(mode, target),
319 Choice3::Two(ref inner) => inner.write_encoded(mode, target),
320 Choice3::Three(ref inner) => inner.write_encoded(mode, target),
321 }
322 }
323}
324
325
326pub struct Iter<T>(pub T);
336
337impl<T> Iter<T> {
338 pub fn new(iter: T) -> Self {
340 Iter(iter)
341 }
342}
343
344pub fn iter<T>(iter: T) -> Iter<T> {
346 Iter::new(iter)
347}
348
349
350impl<T: IntoIterator> IntoIterator for Iter<T> {
353 type Item = <T as IntoIterator>::Item;
354 type IntoIter = <T as IntoIterator>::IntoIter;
355
356 fn into_iter(self) -> Self::IntoIter {
357 self.0.into_iter()
358 }
359}
360
361impl<T: Clone + IntoIterator> IntoIterator for &'_ Iter<T> {
362 type Item = <T as IntoIterator>::Item;
363 type IntoIter = <T as IntoIterator>::IntoIter;
364
365 fn into_iter(self) -> Self::IntoIter {
366 self.0.clone().into_iter()
367 }
368}
369
370
371impl<T> Values for Iter<T>
374where T: Clone + IntoIterator, <T as IntoIterator>::Item: Values {
375 fn encoded_len(&self, mode: Mode) -> usize {
376 self.into_iter().map(|item| item.encoded_len(mode)).sum()
377 }
378
379 fn write_encoded<W: io::Write>(
380 &self,
381 mode: Mode,
382 target: &mut W
383 ) -> Result<(), io::Error> {
384 self.into_iter().try_for_each(|item| item.write_encoded(mode, target))
385 }
386}
387
388
389pub struct Slice<T, F, U, V>
397where T: AsRef<[U]>, F: Fn(&U) -> V {
398 value: T,
400
401 f: F,
403
404 marker: PhantomData<(U, V)>,
406}
407
408impl<T, F, U, V> Slice<T, F, U, V>
409where T: AsRef<[U]>, F: Fn(&U) -> V {
410 pub fn new(value: T, f: F) -> Self {
412 Slice { value, f, marker: PhantomData }
413 }
414}
415
416pub fn slice<T, F, U, V>(value: T, f: F) -> Slice<T, F, U, V>
422where T: AsRef<[U]>, F: Fn(&U) -> V {
423 Slice::new(value, f)
424}
425
426
427impl<T, F, U, V> Values for Slice<T, F, U, V>
430where T: AsRef<[U]>, F: Fn(&U) -> V, V: Values {
431 fn encoded_len(&self, mode: Mode) -> usize {
432 self.value.as_ref().iter().map(|v| (self.f)(v).encoded_len(mode)).sum()
433 }
434
435 fn write_encoded<W: io::Write>(
436 &self,
437 mode: Mode,
438 target: &mut W
439 ) -> Result<(), io::Error> {
440 self.value.as_ref().iter().try_for_each(|v|
441 (self.f)(v).write_encoded(mode, target)
442 )
443 }
444}
445
446
447pub struct Nothing;
455
456impl Values for Nothing {
457 fn encoded_len(&self, _mode: Mode) -> usize {
458 0
459 }
460
461 fn write_encoded<W: io::Write>(
462 &self,
463 _mode: Mode,
464 _target: &mut W
465 ) -> Result<(), io::Error> {
466 Ok(())
467 }
468}
469
470
471pub fn sequence<V: Values>(inner: V) -> impl Values {
475 Constructed::new(Tag::SEQUENCE, inner)
476}
477
478pub fn sequence_as<V: Values>(tag: Tag, inner: V) -> impl Values {
483 Constructed::new(tag, inner)
484}
485
486pub fn set<V: Values>(inner: V) -> impl Values {
488 Constructed::new(Tag::SET, inner)
489}
490
491pub fn set_as<V: Values>(tag: Tag, inner: V) -> impl Values {
496 Constructed::new(tag, inner)
497}
498
499pub fn total_encoded_len(tag: Tag, content_l: usize) -> usize {
504 tag.encoded_len() + Length::Definite(content_l).encoded_len() + content_l
505}
506
507pub fn write_header<W: io::Write>(
512 target: &mut W,
513 tag: Tag,
514 constructed: bool,
515 content_length: usize
516) -> Result<(), io::Error> {
517 tag.write_encoded(constructed, target)?;
518 Length::Definite(content_length).write_encoded(target)?;
519 Ok(())
520}
521
522
523struct EndOfValue;
529
530impl Values for EndOfValue {
531 fn encoded_len(&self, _: Mode) -> usize {
532 2
533 }
534
535 fn write_encoded<W: io::Write>(
536 &self,
537 _: Mode,
538 target: &mut W
539 ) -> Result<(), io::Error> {
540 let buf = [0, 0];
541 target.write_all(&buf)
542 }
543}
544
545
546#[cfg(test)]
549mod test {
550 use super::*;
551 use crate::encode::PrimitiveContent;
552
553 #[test]
554 fn encode_2_tuple() {
555 let mut res = Vec::new();
556 (0.encode(), 1.encode()).write_encoded(Mode::Der, &mut res).unwrap();
557 assert_eq!(res, b"\x02\x01\0\x02\x01\x01");
558 }
559
560 #[test]
561 fn encode_4_tuple() {
562 let mut res = Vec::new();
563 (0.encode(), 1.encode(), 2.encode(), 3.encode())
564 .write_encoded(Mode::Der, &mut res).unwrap();
565 assert_eq!(res, b"\x02\x01\0\x02\x01\x01\x02\x01\x02\x02\x01\x03");
566 }
567}