12
12
//! [simd-json-value]: https://docs.rs/simd-json/latest/simd_json/value/index.html
13
13
//! [serde-json-value]: https://docs.serde.rs/serde_json/value/enum.Value.html
14
14
15
+ use crate :: binary:: binary_writer:: BinaryWriterBuilder ;
15
16
use crate :: element:: builders:: { SequenceBuilder , StructBuilder } ;
16
17
use crate :: element:: reader:: ElementReader ;
17
18
use crate :: ion_data:: { IonEq , IonOrd } ;
18
- #[ cfg( feature = "experimental-writer" ) ]
19
19
use crate :: ion_writer:: IonWriter ;
20
20
use crate :: text:: text_formatter:: IonValueFormatter ;
21
- use crate :: { ion_data , Decimal , Int , IonError , IonResult , IonType , Str , Symbol , Timestamp } ;
22
-
23
- # [ cfg ( feature = "experimental-writer" ) ]
24
- use crate :: TextKind ;
21
+ use crate :: text :: text_writer :: TextWriterBuilder ;
22
+ use crate :: {
23
+ ion_data , Decimal , Format , Int , IonError , IonResult , IonType , Str , Symbol , TextKind , Timestamp ,
24
+ } ;
25
25
use std:: cmp:: Ordering ;
26
26
use std:: fmt:: { Display , Formatter } ;
27
+ use std:: io;
27
28
28
29
mod annotations;
29
30
pub ( crate ) mod iterators;
@@ -40,14 +41,11 @@ mod sequence;
40
41
41
42
// Re-export the Value variant types and traits so they can be accessed directly from this module.
42
43
use crate :: data_source:: IonDataSource ;
43
- #[ cfg( feature = "experimental-writer" ) ]
44
- use crate :: element:: writer:: WriteConfig ;
45
- #[ cfg( feature = "experimental-writer" ) ]
46
- use crate :: lazy:: encoding:: { BinaryEncoding_1_0 , TextEncoding_1_0 } ;
44
+ use crate :: element:: writer:: ElementWriter ;
47
45
use crate :: reader:: ReaderBuilder ;
48
- use crate :: result:: IonFailure ;
49
- use crate :: ElementWriter ;
50
46
use crate :: { Blob , Bytes , Clob , List , SExp , Struct } ;
47
+
48
+ use crate :: result:: IonFailure ;
51
49
pub use annotations:: { Annotations , IntoAnnotations } ;
52
50
pub use sequence:: Sequence ;
53
51
@@ -751,6 +749,104 @@ impl Element {
751
749
Ok ( ( ) )
752
750
}
753
751
752
+ #[ doc = r##"
753
+ Serializes this [`Element`] as Ion, writing the resulting bytes to the provided [`io::Write`].
754
+ The caller must verify that `output` is either empty or only contains Ion of the same
755
+ format (text or binary) before writing begins.
756
+
757
+ This method constructs a new writer for each invocation, which means that there will only be a single
758
+ top level value in the output stream. Writing several values to the same stream is preferable to
759
+ maximize encoding efficiency. See [`write_all_as`](Self::write_all_as) for details.
760
+ "## ]
761
+ #[ cfg_attr(
762
+ feature = "experimental-writer" ,
763
+ doc = r##"
764
+ To reuse a writer and have greater control over resource
765
+ management, see [`Element::write_to`].
766
+ "##
767
+ ) ]
768
+ #[ doc = r##"
769
+ ```
770
+ # use ion_rs::{Format, IonResult, TextKind};
771
+ # fn main() -> IonResult<()> {
772
+ use ion_rs::Element;
773
+ use ion_rs::ion_list;
774
+
775
+ // Construct an Element
776
+ let element_before: Element = ion_list! [1, 2, 3].into();
777
+
778
+ // Write the Element to a buffer using a specified format
779
+ let mut buffer = Vec::new();
780
+ element_before.write_as(Format::Text(TextKind::Pretty), &mut buffer)?;
781
+
782
+ // Read the Element back from the serialized form
783
+ let element_after = Element::read_one(&buffer)?;
784
+
785
+ // Confirm that no data was lost
786
+ assert_eq!(element_before, element_after);
787
+ # Ok(())
788
+ # }
789
+ ```
790
+ "## ]
791
+ pub fn write_as < W : io:: Write > ( & self , format : Format , output : W ) -> IonResult < ( ) > {
792
+ match format {
793
+ Format :: Text ( text_kind) => {
794
+ let mut text_writer = TextWriterBuilder :: new ( text_kind) . build ( output) ?;
795
+ Element :: write_element_to ( self , & mut text_writer) ?;
796
+ text_writer. flush ( )
797
+ }
798
+ Format :: Binary => {
799
+ let mut binary_writer = BinaryWriterBuilder :: default ( ) . build ( output) ?;
800
+ Element :: write_element_to ( self , & mut binary_writer) ?;
801
+ binary_writer. flush ( )
802
+ }
803
+ }
804
+ }
805
+
806
+ /// Serializes each of the provided [`Element`]s as Ion, writing the resulting bytes to the
807
+ /// provided [`io::Write`]. The caller must verify that `output` is either empty or only
808
+ /// contains Ion of the same format (text or binary) before writing begins.
809
+ ///
810
+ /// This method is preferable to [`write_as`](Self::write_as) when writing streams consisting
811
+ /// of more than one top-level value; the writer can re-use the same symbol table definition
812
+ /// to encode each value, resulting in a more compact representation.
813
+ ///
814
+ /// ```
815
+ ///# use ion_rs::IonResult;
816
+ ///# fn main() -> IonResult<()> {
817
+ /// use ion_rs::{Element, Format, ion_seq};
818
+ ///
819
+ /// let elements = ion_seq!("foo", "bar", "baz");
820
+ /// let mut buffer: Vec<u8> = Vec::new();
821
+ /// Element::write_all_as(&elements, Format::Binary, &mut buffer)?;
822
+ /// let roundtrip_elements = Element::read_all(buffer)?;
823
+ /// assert_eq!(elements, roundtrip_elements);
824
+ ///# Ok(())
825
+ ///# }
826
+ /// ```
827
+ pub fn write_all_as < ' a , W : io:: Write , I : IntoIterator < Item = & ' a Element > > (
828
+ elements : I ,
829
+ format : Format ,
830
+ output : W ,
831
+ ) -> IonResult < ( ) > {
832
+ match format {
833
+ Format :: Text ( text_kind) => {
834
+ let mut text_writer = TextWriterBuilder :: new ( text_kind) . build ( output) ?;
835
+ for element in elements {
836
+ Element :: write_element_to ( element, & mut text_writer) ?;
837
+ }
838
+ text_writer. flush ( )
839
+ }
840
+ Format :: Binary => {
841
+ let mut binary_writer = BinaryWriterBuilder :: default ( ) . build ( output) ?;
842
+ for element in elements {
843
+ Element :: write_element_to ( element, & mut binary_writer) ?;
844
+ }
845
+ binary_writer. flush ( )
846
+ }
847
+ }
848
+ }
849
+
754
850
#[ doc = r##"
755
851
Serializes this [`Element`] as binary Ion, returning the output as a `Vec<u8>`.
756
852
"## ]
@@ -785,15 +881,10 @@ assert_eq!(element_before, element_after);
785
881
# }
786
882
```
787
883
"## ]
788
- #[ cfg( feature = "experimental-writer" ) ]
789
884
pub fn to_binary ( & self ) -> IonResult < Vec < u8 > > {
790
- let buffer = Vec :: new ( ) ;
791
- let write_config: WriteConfig < BinaryEncoding_1_0 > =
792
- WriteConfig :: < BinaryEncoding_1_0 > :: new ( ) ;
793
- let mut writer = write_config. build ( buffer) ?;
794
- Element :: write_element_to ( self , & mut writer) ?;
795
- writer. flush ( ) ?;
796
- Ok ( writer. output ( ) . to_owned ( ) . to_owned ( ) )
885
+ let mut buffer = Vec :: new ( ) ;
886
+ self . write_as ( Format :: Binary , & mut buffer) ?;
887
+ Ok ( buffer)
797
888
}
798
889
799
890
#[ doc = r##"
@@ -832,15 +923,10 @@ assert_eq!(element_before, element_after);
832
923
# }
833
924
```
834
925
"## ]
835
- #[ cfg( feature = "experimental-writer" ) ]
836
926
pub fn to_text ( & self , text_kind : TextKind ) -> IonResult < String > {
837
- let buffer = Vec :: new ( ) ;
838
- let write_config: WriteConfig < TextEncoding_1_0 > =
839
- WriteConfig :: < TextEncoding_1_0 > :: new ( text_kind) ;
840
- let mut writer = write_config. build ( buffer) ?;
841
- Element :: write_element_to ( self , & mut writer) ?;
842
- writer. flush ( ) ?;
843
- Ok ( std:: str:: from_utf8 ( writer. output ( ) )
927
+ let mut buffer = Vec :: new ( ) ;
928
+ self . write_as ( Format :: Text ( text_kind) , & mut buffer) ?;
929
+ Ok ( std:: str:: from_utf8 ( & buffer)
844
930
. expect ( "writer produced invalid utf-8" )
845
931
. to_string ( ) )
846
932
}
0 commit comments