der/asn1/
teletex_string.rs1use crate::{
4 asn1::AnyRef, ord::OrdIsValueOrd, ByteSlice, DecodeValue, EncodeValue, Error, FixedTag, Header,
5 Length, Reader, Result, StrSlice, Tag, Writer,
6};
7use core::{fmt, ops::Deref, str};
8
9#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
26pub struct TeletexStringRef<'a> {
27 inner: StrSlice<'a>,
29}
30
31impl<'a> TeletexStringRef<'a> {
32 pub fn new<T>(input: &'a T) -> Result<Self>
34 where
35 T: AsRef<[u8]> + ?Sized,
36 {
37 let input = input.as_ref();
38
39 if input.iter().any(|&c| c > 0x7F) {
41 return Err(Self::TAG.value_error());
42 }
43
44 StrSlice::from_bytes(input)
45 .map(|inner| Self { inner })
46 .map_err(|_| Self::TAG.value_error())
47 }
48}
49
50impl<'a> Deref for TeletexStringRef<'a> {
51 type Target = StrSlice<'a>;
52
53 fn deref(&self) -> &Self::Target {
54 &self.inner
55 }
56}
57
58impl AsRef<str> for TeletexStringRef<'_> {
59 fn as_ref(&self) -> &str {
60 self.as_str()
61 }
62}
63
64impl AsRef<[u8]> for TeletexStringRef<'_> {
65 fn as_ref(&self) -> &[u8] {
66 self.as_bytes()
67 }
68}
69
70impl<'a> DecodeValue<'a> for TeletexStringRef<'a> {
71 fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
72 Self::new(ByteSlice::decode_value(reader, header)?.as_slice())
73 }
74}
75
76impl<'a> EncodeValue for TeletexStringRef<'a> {
77 fn value_len(&self) -> Result<Length> {
78 self.inner.value_len()
79 }
80
81 fn encode_value(&self, writer: &mut dyn Writer) -> Result<()> {
82 self.inner.encode_value(writer)
83 }
84}
85
86impl FixedTag for TeletexStringRef<'_> {
87 const TAG: Tag = Tag::TeletexString;
88}
89
90impl OrdIsValueOrd for TeletexStringRef<'_> {}
91
92impl<'a> From<&TeletexStringRef<'a>> for TeletexStringRef<'a> {
93 fn from(value: &TeletexStringRef<'a>) -> TeletexStringRef<'a> {
94 *value
95 }
96}
97
98impl<'a> TryFrom<AnyRef<'a>> for TeletexStringRef<'a> {
99 type Error = Error;
100
101 fn try_from(any: AnyRef<'a>) -> Result<TeletexStringRef<'a>> {
102 any.decode_into()
103 }
104}
105
106impl<'a> From<TeletexStringRef<'a>> for AnyRef<'a> {
107 fn from(teletex_string: TeletexStringRef<'a>) -> AnyRef<'a> {
108 AnyRef::from_tag_and_value(Tag::TeletexString, teletex_string.inner.into())
109 }
110}
111
112impl<'a> fmt::Display for TeletexStringRef<'a> {
113 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
114 f.write_str(self.as_str())
115 }
116}
117
118impl<'a> fmt::Debug for TeletexStringRef<'a> {
119 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
120 write!(f, "TeletexString({:?})", self.as_str())
121 }
122}
123
124#[cfg(test)]
125mod tests {
126 use super::TeletexStringRef;
127 use crate::Decode;
128 use crate::SliceWriter;
129
130 #[test]
131 fn parse_bytes() {
132 let example_bytes = &[
133 0x14, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x31,
134 ];
135
136 let teletex_string = TeletexStringRef::from_der(example_bytes).unwrap();
137 assert_eq!(teletex_string.as_str(), "Test User 1");
138 let mut out = [0_u8; 30];
139 let mut writer = SliceWriter::new(&mut out);
140 writer.encode(&teletex_string).unwrap();
141 let encoded = writer.finish().unwrap();
142 assert_eq!(encoded, example_bytes);
143 }
144}