diff --git a/src/example.rs b/src/example.rs index 6a2b36a..5a9c267 100644 --- a/src/example.rs +++ b/src/example.rs @@ -61,17 +61,20 @@ impl DataSource for ExampleDataSource { } fn read(&self, config: Value) -> DResult { + let name = match config { + Value::Known(ValueKind::Object(mut obj)) => obj.remove("name").unwrap(), + _ => unreachable!(), + }; + let name_str = match &name { + Value::Known(ValueKind::String(s)) => s.clone(), + _ => unreachable!(), + }; + Ok(Value::Known(ValueKind::Object(BTreeMap::from([ - ( - "name".to_owned(), - match config { - Value::Known(ValueKind::Object(mut obj)) => obj.remove("name").unwrap(), - _ => unreachable!(), - }, - ), + ("name".to_owned(), name), ( "meow".to_owned(), - Value::Known(ValueKind::String("mrrrrr".to_owned())), + Value::Known(ValueKind::String(format!("mrrrrr i am {name_str}"))), ), ( "id".to_owned(), diff --git a/src/main.rs b/src/main.rs index 9f3d551..d206ad9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,7 @@ async fn main() -> eyre::Result<()> { async fn serve(provider: &dyn Provider) -> eyre::Result<()> { tracing_subscriber::fmt() - .with_max_level(Level::ERROR) + .with_max_level(Level::DEBUG) .with_writer(std::io::stderr) .without_time() .init(); diff --git a/src/server/grpc.rs b/src/server/grpc.rs index 5564936..9d5b3f6 100644 --- a/src/server/grpc.rs +++ b/src/server/grpc.rs @@ -255,14 +255,7 @@ impl Provider for super::ProviderHandler { } }; - let state = ds.read(crate::values::Value::Known( - crate::values::ValueKind::Object(BTreeMap::from([( - "name".to_owned(), - crate::values::Value::Known(crate::values::ValueKind::String( - "mykitten".to_owned(), - )), - )])), - )); + let state = ds.read(config); let (state, diagnostics) = match state { Ok(s) => ( Some(tfplugin6::DynamicValue { diff --git a/src/values.rs b/src/values.rs index 474287f..6c46b46 100644 --- a/src/values.rs +++ b/src/values.rs @@ -10,6 +10,7 @@ use rmp::encode::write_bool; use crate::framework::{DResult, Diagnostics}; +#[derive(Debug)] pub enum Type { Bool, Number, @@ -166,6 +167,7 @@ impl Value { } pub fn msg_unpack(data: &[u8], typ: &Type) -> DResult { + tracing::debug!(?typ, ?data, "Unpacking message"); let mut read = io::Cursor::new(data); Self::msg_unpack_inner(&mut read, typ) } @@ -180,7 +182,7 @@ impl Value { let read_string = |rd: &mut io::Cursor<&[u8]>| -> DResult { let len = std::cmp::min(mp::read_str_len(rd)?, 1024 * 1024); // you're not gonna get more than a 1MB string... - let mut buf = Vec::with_capacity(len as usize); + let mut buf = vec![0; len as usize]; rd.read_exact(&mut buf)?; Ok(String::from_utf8(buf)?) }; @@ -209,13 +211,15 @@ impl Value { Type::Dynamic => todo!("dynamic"), Type::List { elem } => { let len = mp::read_array_len(rd)?; + let elems = (0..len) .map(|_| Value::msg_unpack_inner(rd, &elem)) .collect::, _>>()?; ValueKind::List(elems) } Type::Map { elem } => { - let len = mp::read_array_len(rd)?; + let len = mp::read_map_len(rd)?; + let elems = (0..len) .map(|_| -> DResult<_> { let key = read_string(rd)?; @@ -227,6 +231,7 @@ impl Value { } Type::Set { elem } => { let len = mp::read_array_len(rd)?; + let elems = (0..len) .map(|_| Value::msg_unpack_inner(rd, &elem)) .collect::, _>>()?; @@ -234,7 +239,8 @@ impl Value { } Type::Object { attrs, optionals } => { assert!(optionals.is_empty()); - let len = mp::read_array_len(rd)?; + let len = mp::read_map_len(rd)?; + if attrs.len() != (len as usize) { return Err(Diagnostics::error_string(format!( "expected {} attrs, found {len} attrs in object", @@ -245,7 +251,7 @@ impl Value { .map(|_| -> DResult<_> { let key = read_string(rd)?; let typ = attrs.get(&key).ok_or_else(|| { - Diagnostics::error_string(format!("unexpected attribute: {key}")) + Diagnostics::error_string(format!("unexpected attribute: '{key}'")) })?; let value = Value::msg_unpack_inner(rd, &typ)?; Ok((key, value)) @@ -261,11 +267,12 @@ impl Value { elems.len() ))); } + let elems = elems .iter() .map(|typ| Value::msg_unpack_inner(rd, &typ)) .collect::, _>>()?; - ValueKind::List(elems) + ValueKind::Tuple(elems) } }; diff --git a/test/main.tf b/test/main.tf index f0a5859..9fded06 100644 --- a/test/main.tf +++ b/test/main.tf @@ -11,16 +11,19 @@ provider "terustform" {} //resource "terustform_hello" "test1" {} data "terustform_kitty" "kitty" { - name = "mykitten" + name = "aa mykitten" } data "terustform_kitty" "hellyes" { - name = "a cute kitty" + name = "aa a cute kitty" } output "meow" { value = data.terustform_kitty.kitty.id } -output "hellyes" { +output "cat1" { value = data.terustform_kitty.kitty.meow +} +output "cat2" { + value = data.terustform_kitty.hellyes.meow } \ No newline at end of file