Skip to content

Commit

Permalink
Support SMILE
Browse files Browse the repository at this point in the history
  • Loading branch information
jcaesar committed Dec 24, 2022
1 parent 86e282f commit 065757d
Show file tree
Hide file tree
Showing 6 changed files with 146 additions and 0 deletions.
24 changes: 24 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ rmpv = "0.4.2"
serde = "1.0.102"
serde-hjson = "0.9.1"
serde-protobuf = "0.8.1"
serde-smile = "0.1.3"
serde_cbor = "0.10.2"
serde_json = "1.0.41"
serde_yaml = "0.8.11"
Expand Down
35 changes: 35 additions & 0 deletions src/bin/rq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ pub struct Options {
/// Input is a series of YAML documents.
#[structopt(short = "y", long = "input-yaml")]
pub flag_input_yaml: bool,
/// Input is formatted as SMILE
#[structopt(short = "s", long = "input-smile")]
pub flag_input_smile: bool,

#[structopt(short = "A", long = "output-avro")]
pub flag_output_avro: Option<String>,
Expand All @@ -84,6 +87,8 @@ pub struct Options {
pub flag_output_toml: bool,
#[structopt(short = "Y", long = "output-yaml")]
pub flag_output_yaml: bool,
#[structopt(short = "S", long = "output-smile")]
pub flag_output_smile: bool,

#[structopt(short = "l", long = "log")]
pub flag_log: Option<String>,
Expand Down Expand Up @@ -179,6 +184,9 @@ fn run(args: &Options) -> rq::error::Result<()> {
} else if args.flag_input_yaml {
let source = rq::value::yaml::source(&mut input);
run_source(args, source)
} else if args.flag_input_smile {
let source = rq::value::smile::source(&mut input)?;
run_source(args, source)
} else if args.flag_input_raw {
let source = rq::value::raw::source(&mut input);
run_source(args, source)
Expand Down Expand Up @@ -277,6 +285,9 @@ where
rq::value::yaml::sink,
rq::value::yaml::sink
)
} else if args.flag_output_smile {
let sink = rq::value::smile::sink(&mut output)?;
run_source_sink(source, sink)
} else if args.flag_output_raw {
let sink = rq::value::raw::sink(&mut output);
run_source_sink(source, sink)
Expand Down Expand Up @@ -593,6 +604,30 @@ mod test {
assert!(a.flag_output_cbor);
}

#[test]
fn test_docopt_input_smile() {
let a = parse_args(&["rq", "-s"]);
assert!(a.flag_input_smile);
}

#[test]
fn test_docopt_input_smile_long() {
let a = parse_args(&["rq", "--input-smile"]);
assert!(a.flag_input_smile);
}

#[test]
fn test_docopt_output_smile() {
let a = parse_args(&["rq", "-S"]);
assert!(a.flag_output_smile);
}

#[test]
fn test_docopt_output_smile_long() {
let a = parse_args(&["rq", "--output-smile"]);
assert!(a.flag_output_smile);
}

#[test]
fn test_docopt_input_protobuf() {
let a = parse_args(&["rq", "-p", ".foo.Bar"]);
Expand Down
3 changes: 3 additions & 0 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ pub enum Error {
TomlDeserialize(#[cause] toml::de::Error),
#[fail(display = "TOML serialize error")]
TomlSerialize(#[cause] toml::ser::Error),
#[fail(display = "SMILE error")]
Smile(#[cause] serde_smile::Error),
#[fail(display = "glob error")]
Glob(#[cause] glob::GlobError),
#[fail(display = "glob pattern error")]
Expand Down Expand Up @@ -142,6 +144,7 @@ gen_from!(serde_yaml::Error, Yaml);
gen_from!(yaml_rust::ScanError, YamlScan);
gen_from!(toml::de::Error, TomlDeserialize);
gen_from!(toml::ser::Error, TomlSerialize);
gen_from!(serde_smile::Error, Smile);
gen_from!(glob::GlobError, Glob);
gen_from!(glob::PatternError, GlobPattern);
gen_from!(csv::Error, Csv);
Expand Down
1 change: 1 addition & 0 deletions src/value/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub mod json;
pub mod messagepack;
pub mod protobuf;
pub mod raw;
pub mod smile;
pub mod toml;
pub mod yaml;

Expand Down
82 changes: 82 additions & 0 deletions src/value/smile.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
use crate::error;

use crate::value;
use serde;
use serde_smile;
use std::fmt;
use std::io;

pub struct Source<R>(
serde_smile::de::StreamDeserializer<
'static,
serde_smile::de::IoRead<io::BufReader<R>>,
value::Value,
>,
)
where
R: io::Read;

pub struct Sink<W>(serde_smile::ser::Serializer<W>)
where
W: io::Write;

#[inline]
pub fn source<R>(r: R) -> error::Result<Source<R>>
where
R: io::Read,
{
Ok(Source(
serde_smile::de::Deserializer::new(serde_smile::de::IoRead::new(io::BufReader::new(r)))?
.into_iter(),
))
}

#[inline]
pub fn sink<W>(w: W) -> error::Result<Sink<W>>
where
W: io::Write,
{
Ok(Sink(
serde_smile::ser::Serializer::builder()
.shared_strings(true)
.build(w)?,
))
}

impl<R> value::Source for Source<R>
where
R: io::Read,
{
#[inline]
fn read(&mut self) -> error::Result<Option<value::Value>> {
Ok(self.0.next().transpose()?)
}
}

impl<W> value::Sink for Sink<W>
where
W: io::Write,
{
#[inline]
fn write(&mut self, v: value::Value) -> error::Result<()> {
Ok(serde::Serialize::serialize(&v, &mut self.0)?)
}
}

impl<R> fmt::Debug for Source<R>
where
R: io::Read,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SmileSource").finish()
}
}

impl<W> fmt::Debug for Sink<W>
where
W: io::Write,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SmileSink").finish()
}
}

0 comments on commit 065757d

Please sign in to comment.