diff options
author | Teddy Wing | 2022-03-17 23:57:09 +0100 |
---|---|---|
committer | Teddy Wing | 2022-03-17 23:57:09 +0100 |
commit | bd16ac71423ea5abd3d406d8f9fe579f3fec8ee0 (patch) | |
tree | d18e85a5496beca8c0d9795b86cce4af40594048 /src/yaml | |
parent | b6549729be4b12c3a88ce70761d00c5d50946fc0 (diff) | |
download | yaqlite-bd16ac71423ea5abd3d406d8f9fe579f3fec8ee0.tar.bz2 |
Yaml: Wrap a `Cow<'_, yaml_rust::Yaml>` instead of `yaml_rust::Yaml`
This allows us to use a borrowed `yaml_rust::Yaml` for `ToSql` and an
owned `yaml_rust::Yaml` for `FromSql`.
Diffstat (limited to 'src/yaml')
-rw-r--r-- | src/yaml/sql.rs | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/yaml/sql.rs b/src/yaml/sql.rs index d065718..26ef45f 100644 --- a/src/yaml/sql.rs +++ b/src/yaml/sql.rs @@ -1,13 +1,25 @@ use yaml_rust::yaml; +use std::borrow::Cow; -pub struct Yaml<'a>(pub &'a yaml::Yaml); + +pub struct Yaml<'a>(pub Cow<'a, yaml::Yaml>); + +// impl<'a, Y> From<Y> for Yaml<'a> +// where Y: Into<yaml_rust::Yaml> +// { +// fn from(yaml: Y) -> Self { +// Self(Cow::from(yaml)) +// } +// } + +// impl From< impl<'a> rusqlite::ToSql for Yaml<'a> { fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> { use rusqlite::types::ToSqlOutput; - let sql_output = match self.0 { + let sql_output = match *self.0 { yaml::Yaml::Real(_) => match self.0.as_f64() { Some(v) => ToSqlOutput::from(v), None => ToSqlOutput::from(rusqlite::types::Null), @@ -42,22 +54,24 @@ impl<'a> rusqlite::types::FromSql for Yaml<'a> { use rusqlite::types::ValueRef; match value { - ValueRef::Integer(i) => Ok(Yaml(&yaml_rust::Yaml::Integer(i))), + ValueRef::Integer(i) => Ok( + Yaml(Cow::Owned(yaml_rust::Yaml::Integer(i))), + ), ValueRef::Real(f) => - Ok(Yaml(&yaml_rust::Yaml::Real(f.to_string()))), + Ok(Yaml(Cow::Owned(yaml_rust::Yaml::Real(f.to_string())))), ValueRef::Text(_) => { let s = value.as_str()?; - Ok(Yaml(&yaml_rust::Yaml::String(s.to_owned()))) + Ok(Yaml(Cow::Owned(yaml_rust::Yaml::String(s.to_owned())))) } ValueRef::Blob(_) => { // TODO: How should we handle blobs? Parsing as string might not // make the most sense. let b = value.as_str()?; - Ok(Yaml(&yaml_rust::Yaml::String(b.to_owned()))) + Ok(Yaml(Cow::Owned(yaml_rust::Yaml::String(b.to_owned())))) } - ValueRef::Null => Ok(Yaml(&yaml_rust::Yaml::Null)), + ValueRef::Null => Ok(Yaml(Cow::Owned(yaml_rust::Yaml::Null))), } } } |