Skip to content

Commit

Permalink
correctly use default_values where appropriate
Browse files Browse the repository at this point in the history
Signed-off-by: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
  • Loading branch information
Keruspe committed Apr 9, 2019
1 parent 25c9d3a commit 82a7e67
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
34 changes: 31 additions & 3 deletions codegen/src/templating.rs
@@ -1,7 +1,7 @@
use crate::specs::*;
use crate::util::*;

use amq_protocol_types::AMQPType;
use amq_protocol_types::{AMQPType, AMQPValue};
use handlebars::{self, Context, Handlebars, Helper, HelperDef, HelperResult, JsonValue, Output, Renderable, RenderContext, RenderError, ScopedJson, to_json};
use hashbrown::HashMap;
use serde_json::{self, Value};
Expand Down Expand Up @@ -40,6 +40,7 @@ impl HandlebarsAMQPExtension for CodeGenerator {
self.register_helper("each_argument", Box::new(EachArgumentHelper));
self.register_helper("each_flag", Box::new(EachFlagHelper));
self.register_helper("array_contains", Box::new(ArrayContainsHelper));
self.register_helper("amqp_value", Box::new(AMQPValueHelper));
self
}

Expand Down Expand Up @@ -234,12 +235,39 @@ impl HelperDef for ArrayContainsHelper {
}
}

/// Helper for checking if an array contains a given element
pub struct AMQPValueHelper;
impl HelperDef for AMQPValueHelper {
fn call_inner<'reg: 'rc, 'rc>(&self, h: &Helper<'reg, 'rc>, _: &'reg Handlebars, _: &'rc Context, _: &mut RenderContext<'reg>) -> Result<Option<ScopedJson<'reg, 'rc>>, RenderError> {
let arg = h.param(0).ok_or_else(|| RenderError::new("First param not found for helper \"amqp_value\""))?;
let param: AMQPValue = serde_json::from_value(arg.value().clone()).map_err(|_| RenderError::new("Param is not an AMQPValue for helper \"amqp_value\""))?;
let value = match param {
AMQPValue::Boolean(v) => serde_json::to_value(v)?,
AMQPValue::ShortShortInt(v) => serde_json::to_value(v)?,
AMQPValue::ShortShortUInt(v) => serde_json::to_value(v)?,
AMQPValue::ShortInt(v) => serde_json::to_value(v)?,
AMQPValue::ShortUInt(v) => serde_json::to_value(v)?,
AMQPValue::LongInt(v) => serde_json::to_value(v)?,
AMQPValue::LongUInt(v) => serde_json::to_value(v)?,
AMQPValue::LongLongInt(v) => serde_json::to_value(v)?,
AMQPValue::Float(v) => serde_json::to_value(v)?,
AMQPValue::Double(v) => serde_json::to_value(v)?,
AMQPValue::DecimalValue(v) => serde_json::to_value(v)?,
AMQPValue::LongString(v) => serde_json::to_value(v)?,
AMQPValue::FieldArray(v) => serde_json::to_value(v)?,
AMQPValue::Timestamp(v) => serde_json::to_value(v)?,
AMQPValue::FieldTable(v) => serde_json::to_value(v)?,
AMQPValue::ByteArray(v) => serde_json::to_value(v)?,
AMQPValue::Void => JsonValue::Null,
};
Ok(Some(ScopedJson::Derived(value)))
}
}

#[cfg(test)]
mod test {
use super::*;

use amq_protocol_types::*;

use std::collections::BTreeMap;

pub const TEMPLATE: &'static str = r#"
Expand Down
2 changes: 1 addition & 1 deletion protocol/templates/protocol.rs
Expand Up @@ -240,7 +240,7 @@ pub mod {{snake class.name}} {
gen_id({{method.id}})
{{#each_argument method.arguments as |argument| ~}}
{{#if argument_is_value ~}}
>> gen_{{snake_type argument.type}}({{#if (array_contains method.metadata.force_default argument.name) ~}}Default::default(){{else}}method.{{snake argument.name}}.as_gen_ref(){{/if ~}})
>> gen_{{snake_type argument.type}}({{#if (array_contains method.metadata.force_default argument.name) ~}}{{amqp_value argument.default_value}}{{else}}method.{{snake argument.name}}.as_gen_ref(){{/if ~}})
{{else}}
>> gen_flags(&flags)
{{/if ~}}
Expand Down

0 comments on commit 82a7e67

Please sign in to comment.