diff --git a/src/convert/flags.rs b/src/convert/flags.rs new file mode 100644 index 0000000..999c8be --- /dev/null +++ b/src/convert/flags.rs @@ -0,0 +1,62 @@ +// Copyright 2017 Jeremy Wall +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::rc::Rc; +use std::io::Write; +use std::io::Result; + +use build::Val; +use convert::traits::Converter; + +pub struct FlagConverter {} + +impl FlagConverter { + pub fn new() -> Self { + FlagConverter {} + } +} + +impl FlagConverter { + fn write(&self, v: &Val, w: &mut Write) -> Result<()> { + match v { + &Val::Float(ref f) => { + try!(write!(w, "{} ", f)); + }, + &Val::Int(ref i) => { + try!(write!(w, "{} ", i)); + }, + &Val::String(ref s) => { + try!(write!(w, "'{}' ", s)); + }, + &Val::Tuple(ref flds) => { + for &(ref name, ref val) in flds.iter() { + try!(write!(w, "--{} ", name.val)); + // TODO(jwall): What if the value is a tuple? + try!(self.write(&val, w)); + } + }, + &Val::Macro(ref _def) => { + // This is ignored + eprintln!("Skipping macro..."); + } + } + Ok(()) + } +} + +impl Converter for FlagConverter { + fn convert(&self, v: Rc, mut w: Box) -> Result<()> { + return self.write(&v, &mut w); + } +} diff --git a/src/convert/mod.rs b/src/convert/mod.rs new file mode 100644 index 0000000..64d947e --- /dev/null +++ b/src/convert/mod.rs @@ -0,0 +1,40 @@ +// Copyright 2017 Jeremy Wall +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +pub mod flags; +pub mod traits; + +use std::io; +use std::io::Write; +use std::rc::Rc; + +use build::Val; + +pub struct ConverterRunner { + converter: Box, +} + +impl ConverterRunner { + pub fn new(typ: &str) -> Result { + if typ == "flags" { + return Ok(ConverterRunner { + converter: Box::new(flags::FlagConverter::new()), + }); + } + return Err(format!("Unknown Target output type: {}", typ)) + } + + pub fn convert(&self, v: Rc, w: Box) -> io::Result<()> { + self.converter.convert(v, w) + } +} \ No newline at end of file diff --git a/src/convert/traits.rs b/src/convert/traits.rs new file mode 100644 index 0000000..eb530bd --- /dev/null +++ b/src/convert/traits.rs @@ -0,0 +1,23 @@ +// Copyright 2017 Jeremy Wall +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::rc::Rc; +use std::io::Write; +use std::io::Result; + +use build::Val; + +pub trait Converter { + fn convert(&self, vs: Rc, w: Box) -> Result<()>; +} diff --git a/src/main.rs b/src/main.rs index d970464..0aee191 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,6 @@ use std::process; use ucglib::build::Val; use ucglib::build; -//use ucglib::convert::get_converter; use ucglib::convert::ConverterRunner; // TODO(jwall): List the target output types automatically.