diff options
author | Arthur Taylor <codders@octomonkey.org.uk> | 2016-09-05 15:43:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-05 15:43:23 +0200 |
commit | 0167dce98692f707b74395977c478c2ca44fa0c7 (patch) | |
tree | 53db4ad3d930e586be4ec946b0bbbfdda5350732 /src/datatype/dbus.rs | |
parent | d37818fa5ac01e2bf05c9b6c71362b41691a01f1 (diff) | |
parent | db7575f02de4064a7afaa10c3ae33349fadbf605 (diff) | |
download | rvi_sota_client-0167dce98692f707b74395977c478c2ca44fa0c7.tar.gz |
Merge pull request #8 from advancedtelematic/stable
Merge latest advancedtelematic/stable
Diffstat (limited to 'src/datatype/dbus.rs')
-rw-r--r-- | src/datatype/dbus.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/datatype/dbus.rs b/src/datatype/dbus.rs new file mode 100644 index 0000000..a038568 --- /dev/null +++ b/src/datatype/dbus.rs @@ -0,0 +1,81 @@ +use dbus::{FromMessageItem, MessageItem}; +use toml::{decode, Table, Value}; + +use datatype::update_report::{InstalledFirmware, InstalledPackage, OperationResult}; + + +static MISSING_ARG: &'static str = "Error.MissingArgument"; +static MALFORMED_ARG: &'static str = "Error.MalformedArgument"; + +/// Format a `DBus` error message indicating a missing argument. +pub fn missing_arg() -> (&'static str, String) { + (MISSING_ARG, "Missing argument".to_string()) +} + +/// Format a `DBus` error message indicating a malformed argument. +pub fn malformed_arg() -> (&'static str, String) { + (MALFORMED_ARG, "Malformed argument".to_string()) +} + + +struct DecodedValue(pub Value); + +impl<'m> FromMessageItem<'m> for DecodedValue { + fn from(m: &'m MessageItem) -> Result<Self, ()> { + match *m { + MessageItem::Str(ref b) => Ok(DecodedValue(Value::String(b.clone()))), + MessageItem::Bool(ref b) => Ok(DecodedValue(Value::Boolean(*b))), + MessageItem::Byte(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::Int16(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::Int32(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::Int64(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::UInt16(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::UInt32(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::UInt64(ref b) => Ok(DecodedValue(Value::Integer(*b as i64))), + MessageItem::Variant(ref b) => FromMessageItem::from(&**b), + _ => Err(()) + } + } +} + + +struct DecodedStruct(pub Value); + +impl<'m> FromMessageItem<'m> for DecodedStruct { + fn from(item: &'m MessageItem) -> Result<Self, ()> { + let items: &Vec<MessageItem> = try!(FromMessageItem::from(item)); + items.iter().map(|entry| { + let entry: Result<(&MessageItem, &MessageItem), ()> = FromMessageItem::from(entry); + entry.and_then(|(key, val)| { + let key: Result<&String,()> = FromMessageItem::from(key); + key.and_then(|key| { + let val: Result<DecodedValue,()> = FromMessageItem::from(val); + val.map(|val| (key.clone(), val.0)) + }) + }) + }).collect::<Result<Vec<(_, _)>, ()>>() + .map(|arr| DecodedStruct(Value::Table(arr.into_iter().collect::<Table>()))) + } +} + + +impl<'m> FromMessageItem<'m> for OperationResult { + fn from(item: &'m MessageItem) -> Result<Self, ()> { + let item: DecodedStruct = try!(FromMessageItem::from(item)); + decode::<OperationResult>(item.0).ok_or(()) + } +} + +impl<'m> FromMessageItem<'m> for InstalledPackage { + fn from(item: &'m MessageItem) -> Result<Self, ()> { + let item: DecodedStruct = try!(FromMessageItem::from(item)); + decode::<InstalledPackage>(item.0).ok_or(()) + } +} + +impl<'m> FromMessageItem<'m> for InstalledFirmware { + fn from(item: &'m MessageItem) -> Result<Self, ()> { + let item: DecodedStruct = try!(FromMessageItem::from(item)); + decode::<InstalledFirmware>(item.0).ok_or(()) + } +} |