Struct admerge::RsMerger [−][src]
A Merger that can merge multiple sources that implement Read
and Seek
into one.
Generally speaking, when using RsMerger
, you’ll first call new
to create a
merger builder, then call configuration methods to set each option. And eventually, call
merge_sources_into
to actually merge multiple sources into a given writer.
Behaviours
The current algorithm to merge sources is described as following:
- If any leading padding is given by
pad_with
, writes it into the writer. - For each source, if skip range is given by
skip_head
andskip_tail
, writes the contents remaining into the writer. - For each source, if forcing ending newline option is set by
force_ending_newline
, writes a ending newline into the writer if this source is not ends with a newline. - For each source, if any inner padding is given by
pad_with
, writes it into the writer. - If any ending padding is given by
pad_with
, writes it into the writer.
Examples
use admerge::{RsMerger, Skip, Pad, Newline, Result}; use std::io::Cursor; fn main() -> Result<()> { // Cursor implements `Read` and `Seek`. let mut c1 = Cursor::new(" record 1\n date created: 2000/01/01\n"); let mut c2 = Cursor::new(" record 2\n date created: 2000/01/01\n"); let mut c3 = Cursor::new(" record 3\n date created: 2000/01/01\n"); let mut buf = Vec::new(); // Configures merger. let mut merger = RsMerger::new(); merger.skip_tail(Skip::LinesOnce(1)); merger.pad_with(Pad::Before(b"header\n")); merger.force_ending_newline(Newline::Lf); // Merges sources into one. merger.merge_sources_into(vec![&mut c1, &mut c2, &mut c3], &mut buf)?; assert_eq!( std::str::from_utf8(&buf).unwrap(), "header\n record 1\n record 2\n record 3\n date created: 2000/01/01\n" ); Ok(()) }
Implementations
impl<'a> RsMerger<'a>
[src]
pub fn new() -> Self
[src]
Creates a new RsMerger
builder.
Examples
use admerge::{RsMerger, Result}; use std::io::Cursor; fn main() -> Result<()> { let c1 = Cursor::new("foo "); let c2 = Cursor::new("bar "); let c3 = Cursor::new("baz "); let mut buf = Vec::new(); let merger = RsMerger::new(); merger.merge_sources_into(vec![c1, c2, c3], &mut buf)?; Ok(()) }
pub fn skip_head(&mut self, skip: Skip<'a>) -> &mut Self
[src]
Configures this merger to skip partial of contents from the head of each source.
Examples
Keeps the first given source untouched, but skips first line from the rest sources.
use admerge::{RsMerger, Skip, Result}; use std::io::Cursor; fn main() -> Result<()> { // Cursor implements `Read` and `Seek`. let mut c1 = Cursor::new("header\n record 1\n"); let mut c2 = Cursor::new("header\n record 2\n"); let mut c3 = Cursor::new("header\n record 3\n"); let mut buf = Vec::new(); // Configures merger. let mut merger = RsMerger::new(); merger.skip_head(Skip::LinesOnce(1)); // Merges sources into one. merger.merge_sources_into(vec![&mut c1, &mut c2, &mut c3], &mut buf)?; assert_eq!( std::str::from_utf8(&buf).unwrap(), "header\n record 1\n record 2\n record 3\n" ); Ok(()) }
pub fn skip_tail(&mut self, skip: Skip<'a>) -> &mut Self
[src]
Configures this merger to skip partial of contents from the tail of each source.
Examples
Keeps the last given source untouched, but skips last line from the rest sources.
use admerge::{RsMerger, Skip, Result}; use std::io::Cursor; fn main() -> Result<()> { // Cursor implements `Read` and `Seek`. let mut c1 = Cursor::new(" record 1\n date created: 2000/01/01\n"); let mut c2 = Cursor::new(" record 2\n date created: 2000/01/01\n"); let mut c3 = Cursor::new(" record 3\n date created: 2000/01/01\n"); let mut buf = Vec::new(); // Configures merger. let mut merger = RsMerger::new(); merger.skip_tail(Skip::LinesOnce(1)); // Merges sources into one. merger.merge_sources_into(vec![&mut c1, &mut c2, &mut c3], &mut buf)?; assert_eq!( std::str::from_utf8(&buf).unwrap(), " record 1\n record 2\n record 3\n date created: 2000/01/01\n" ); Ok(()) }
pub fn pad_with(&mut self, padding: Pad<'a>) -> &mut Self
[src]
Configures this merger to fill some padding before, between or after the given sources.
Examples
use admerge::{RsMerger, Pad, Result}; use std::io::Cursor; fn main() -> Result<()> { // Cursor implements `Read` and `Seek`. let mut c1 = Cursor::new(" record 1 "); let mut c2 = Cursor::new(" record 2 "); let mut c3 = Cursor::new(" record 3 "); let mut buf = Vec::new(); // Configures merger. let mut merger = RsMerger::new(); merger.pad_with(Pad::Custom( Some(b"header"), Some(b"padding"), Some(b"date created: 2000/01/01") )); // Merges sources into one. merger.merge_sources_into(vec![&mut c1, &mut c2, &mut c3], &mut buf)?; assert_eq!( std::str::from_utf8(&buf).unwrap(), "header record 1 padding record 2 padding record 3 date created: 2000/01/01" ); Ok(()) }
pub fn force_ending_newline(&mut self, newline: Newline) -> &mut Self
[src]
Configures this merger to force the presence of ending newline after each source.
Noting that ending newlines are given after sources, not after paddings.
Examples
use admerge::{RsMerger, Newline, Result}; use std::io::Cursor; fn main() -> Result<()> { // Cursor implements `Read` and `Seek`. let mut c1 = Cursor::new(" line 1 "); let mut c2 = Cursor::new(" line 2 "); let mut c3 = Cursor::new(" line 3 "); let mut buf = Vec::new(); // Configures merger. let mut merger = RsMerger::new(); merger.force_ending_newline(Newline::Crlf); // Merges sources into one. merger.merge_sources_into(vec![&mut c1, &mut c2, &mut c3], &mut buf)?; assert_eq!( std::str::from_utf8(&buf).unwrap(), " line 1 \r\n line 2 \r\n line 3 \r\n" ); Ok(()) }
pub fn merge_sources_into<RS, W>(
&self,
sources: Vec<RS>,
writer: &mut W
) -> Result<()> where
RS: Read + Seek,
W: Write,
[src]
&self,
sources: Vec<RS>,
writer: &mut W
) -> Result<()> where
RS: Read + Seek,
W: Write,
Merges the given sources into the given writer according to the given configurations.
Errors
Returns an error variant of ErrorKind::NothingPassed
if the given source vector is
empty;
Returns an error variant of ErrorKind::InvalidSkip
if the given Skip
s cannot
applied to the given sources;
Returns an error variant of ErrorKind::Io
if any I/O errors were encountered.
Examples
use admerge::{RsMerger, Skip, Pad, Newline, Result}; use std::io::Cursor; fn main() -> Result<()> { // Cursor implements `Read` and `Seek`. let mut c1 = Cursor::new(" record 1\n date created: 2000/01/01\n"); let mut c2 = Cursor::new(" record 2\n date created: 2000/01/01\n"); let mut c3 = Cursor::new(" record 3\n date created: 2000/01/01\n"); let mut buf = Vec::new(); // Configures merger. let mut merger = RsMerger::new(); merger.skip_tail(Skip::LinesOnce(1)); merger.pad_with(Pad::Before(b"header\n")); merger.force_ending_newline(Newline::Lf); // Merges sources into one. merger.merge_sources_into(vec![&mut c1, &mut c2, &mut c3], &mut buf)?; assert_eq!( std::str::from_utf8(&buf).unwrap(), "header\n record 1\n record 2\n record 3\n date created: 2000/01/01\n" ); Ok(()) }
Trait Implementations
impl<'a> Clone for RsMerger<'a>
[src]
impl<'a> Debug for RsMerger<'a>
[src]
impl<'a> Default for RsMerger<'a>
[src]
Auto Trait Implementations
impl<'a> RefUnwindSafe for RsMerger<'a>
impl<'a> Send for RsMerger<'a>
impl<'a> Sync for RsMerger<'a>
impl<'a> Unpin for RsMerger<'a>
impl<'a> UnwindSafe for RsMerger<'a>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,