diff --git a/ftd/src/interpreter/test.rs b/ftd/src/interpreter/test.rs index 8f5e5f1947..537e724888 100644 --- a/ftd/src/interpreter/test.rs +++ b/ftd/src/interpreter/test.rs @@ -278,20 +278,10 @@ fn test_extract_kwargs() { .unwrap_or_else(|e| panic!("{:?}", e)); let tdoc = doc.tdoc(); - let instructions = doc.get_instructions("foo#foo"); let instruction = instructions.first().unwrap(); - let kwargs = instruction.get_kwargs("data", &tdoc).unwrap().unwrap(); - // TODO: resolve value based on kwarg kind - let data: std::collections::BTreeMap = kwargs - .iter() - .map(|(name, property_value)| { - ( - name.to_string(), - property_value.to_value().get_string_data().unwrap(), - ) - }) - .collect(); + + let data = instruction.get_kwargs("data", &tdoc).unwrap(); assert_eq!(data.get("bar"), Some(&String::from("Hello"))); assert_eq!(data.get("baz"), Some(&String::from("World"))); diff --git a/ftd/src/interpreter/things/component.rs b/ftd/src/interpreter/things/component.rs index ce2e436269..bc96cf6689 100644 --- a/ftd/src/interpreter/things/component.rs +++ b/ftd/src/interpreter/things/component.rs @@ -226,19 +226,38 @@ impl Component { &self, kwargs_name: &str, doc: &ftd::interpreter::TDoc, - ) -> ftd::interpreter::Result< - Option>, - > { - let property = - if let Some(property) = self.get_interpreter_value_of_argument(kwargs_name, doc)? { - property - } else { - return Ok(None); - }; + ) -> ftd::interpreter::Result> { + let property = match self.get_interpreter_value_of_argument(kwargs_name, doc)? { + Some(property) => property, + None => { + return Err(ftd::interpreter::Error::OtherError(format!( + "kw-args '{}' does not exists on component.", + kwargs_name + ))); + } + }; + + let kwargs = property + .kwargs(doc.name, self.line_number)? + .iter() + .map(|(name, value)| { + let value = match value.to_value().get_string_data() { + Some(v) => v, + None => { + return Err(ftd::interpreter::Error::ParseError { + message: "Could not parse keyword argument value as string." + .to_string(), + doc_id: doc.name.to_string(), + line_number: value.line_number(), + }); + } + }; - let kwargs = property.kwargs(doc.name, self.line_number)?; + Ok((name.to_string(), value)) + }) + .collect::, _>>()?; - Ok(Some(kwargs)) + Ok(kwargs) } pub(crate) fn is_loop(&self) -> bool {