1use std::io;
2use std::marker::PhantomData;
3
4use crate::lazy::encoder::value_writer::SequenceWriter;
5use crate::lazy::encoder::write_as_ion::WriteAsIon;
6use crate::lazy::encoder::writer::Writer;
7use crate::lazy::encoding::{
8 BinaryEncoding_1_0, BinaryEncoding_1_1, Encoding, OutputFromBytes, TextEncoding_1_0,
9 TextEncoding_1_1,
10};
11use crate::{IonResult, TextFormat};
12
13#[derive(Clone, Debug)]
16pub struct WriteConfig<E: Encoding> {
17 pub(crate) kind: WriteConfigKind,
18 phantom_data: PhantomData<E>,
19}
20
21impl<E: Encoding> WriteConfig<E> {
22 pub(crate) fn encode<V: WriteAsIon>(&self, value: V) -> IonResult<E::Output> {
23 let bytes = self.encode_to(value, Vec::new())?;
24 Ok(E::Output::from_bytes(bytes))
25 }
26
27 pub(crate) fn encode_all<V: WriteAsIon, I: IntoIterator<Item = V>>(
28 &self,
29 values: I,
30 ) -> IonResult<E::Output> {
31 let bytes = self.encode_all_to(Vec::new(), values)?;
32 Ok(E::Output::from_bytes(bytes))
33 }
34
35 pub(crate) fn encode_to<V: WriteAsIon, W: io::Write>(
36 &self,
37 value: V,
38 output: W,
39 ) -> IonResult<W> {
40 let mut writer = Writer::new(self.clone(), output)?;
41 writer.write(value)?;
42 writer.close()
43 }
44
45 pub(crate) fn encode_all_to<V: WriteAsIon, I: IntoIterator<Item = V>, W: io::Write>(
46 &self,
47 output: W,
48 values: I,
49 ) -> IonResult<W> {
50 let mut writer = Writer::new(self.clone(), output)?;
51 writer.write_all(values)?;
52 writer.close()
53 }
54}
55
56impl WriteConfig<TextEncoding_1_0> {
57 pub fn new(text_kind: TextFormat) -> Self {
58 Self {
59 kind: WriteConfigKind::Text(TextWriteConfig { text_kind }),
60 phantom_data: Default::default(),
61 }
62 }
63}
64
65impl WriteConfig<TextEncoding_1_1> {
66 pub(crate) fn new(text_kind: TextFormat) -> Self {
67 Self {
68 kind: WriteConfigKind::Text(TextWriteConfig { text_kind }),
69 phantom_data: Default::default(),
70 }
71 }
72}
73
74impl WriteConfig<BinaryEncoding_1_0> {
75 pub fn new() -> Self {
76 Self {
77 kind: WriteConfigKind::Binary(BinaryWriteConfig),
78 phantom_data: Default::default(),
79 }
80 }
81}
82
83impl WriteConfig<BinaryEncoding_1_1> {
84 pub(crate) fn new() -> Self {
85 Self {
86 kind: WriteConfigKind::Binary(BinaryWriteConfig),
87 phantom_data: Default::default(),
88 }
89 }
90}
91
92impl Default for WriteConfig<TextEncoding_1_0> {
93 fn default() -> Self {
94 Self::new(TextFormat::Compact)
95 }
96}
97
98impl Default for WriteConfig<TextEncoding_1_1> {
99 fn default() -> Self {
100 Self::new(TextFormat::Compact)
101 }
102}
103
104impl Default for WriteConfig<BinaryEncoding_1_0> {
105 fn default() -> Self {
106 Self::new()
107 }
108}
109
110impl Default for WriteConfig<BinaryEncoding_1_1> {
111 fn default() -> Self {
112 Self::new()
113 }
114}
115
116#[derive(Clone, Debug)]
118pub(crate) enum WriteConfigKind {
119 Text(TextWriteConfig),
120 Binary(BinaryWriteConfig),
121}
122
123#[derive(Clone, Debug)]
125pub(crate) struct TextWriteConfig {
126 pub(crate) text_kind: TextFormat,
127}
128
129#[derive(Clone, Debug)]
132pub(crate) struct BinaryWriteConfig;
133
134impl From<TextEncoding_1_0> for WriteConfig<TextEncoding_1_0> {
135 fn from(_encoding: TextEncoding_1_0) -> Self {
136 WriteConfig::<TextEncoding_1_0>::default()
137 }
138}
139
140impl From<TextEncoding_1_1> for WriteConfig<TextEncoding_1_1> {
141 fn from(_encoding: TextEncoding_1_1) -> Self {
142 WriteConfig::<TextEncoding_1_1>::default()
143 }
144}
145
146impl From<BinaryEncoding_1_0> for WriteConfig<BinaryEncoding_1_0> {
147 fn from(_encoding: BinaryEncoding_1_0) -> Self {
148 WriteConfig::<BinaryEncoding_1_0>::default()
149 }
150}
151
152impl From<BinaryEncoding_1_1> for WriteConfig<BinaryEncoding_1_1> {
153 fn from(_encoding: BinaryEncoding_1_1) -> Self {
154 WriteConfig::<BinaryEncoding_1_1>::default()
155 }
156}