Skip to main content

ion_rs/
write_config.rs

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/// Writer configuration to provide format and Ion version details to writer through encoding
14/// This will be used to create a writer without specifying which writer methods to use
15#[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/// Writer configuration type enum for text and binary configuration
117#[derive(Clone, Debug)]
118pub(crate) enum WriteConfigKind {
119    Text(TextWriteConfig),
120    Binary(BinaryWriteConfig),
121}
122
123/// Text writer configuration with text kind to be used to create a writer
124#[derive(Clone, Debug)]
125pub(crate) struct TextWriteConfig {
126    pub(crate) text_kind: TextFormat,
127}
128
129/// Binary writer configuration to be used to create a writer
130// TODO: Add appropriate binary configuration if required for 1.1
131#[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}