From d1bae418f9f3eef4971e3e593cc11b5eea86e798 Mon Sep 17 00:00:00 2001 From: moznion Date: Thu, 3 Dec 2020 01:02:54 +0900 Subject: [PATCH] Make code-generator generatable the code for Date type --- code-generator/src/main.rs | 42 ++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/code-generator/src/main.rs b/code-generator/src/main.rs index ff922d2..0c4e60a 100644 --- a/code-generator/src/main.rs +++ b/code-generator/src/main.rs @@ -45,6 +45,7 @@ enum RadiusAttributeValueType { TunnelPassword, Octets, IpAddr, + Date, Integer, VSA, } @@ -56,6 +57,7 @@ impl FromStr for RadiusAttributeValueType { "string" => Ok(RadiusAttributeValueType::String), "octets" => Ok(RadiusAttributeValueType::Octets), "ipaddr" => Ok(RadiusAttributeValueType::IpAddr), + "date" => Ok(RadiusAttributeValueType::Date), "integer" => Ok(RadiusAttributeValueType::Integer), "vsa" => Ok(RadiusAttributeValueType::VSA), _ => Err(()), @@ -115,6 +117,8 @@ fn generate_header(w: &mut BufWriter) { use std::net::Ipv4Addr; +use chrono::{DateTime, Utc}; + use crate::avp::{AVP, AVPType, AVPError}; use crate::packet::Packet; use crate::tag::Tag; @@ -187,23 +191,27 @@ fn generate_attribute_code( false => generate_string_attribute_code(w, &method_identifier, &type_identifier), }, RadiusAttributeValueType::UserPassword => match attr.has_tag { - true => unimplemented!(), + true => unimplemented!("tagged-user-password"), false => generate_user_password_attribute_code(w, &method_identifier, &type_identifier), }, RadiusAttributeValueType::TunnelPassword => match attr.has_tag { true => { generate_tunnel_password_attribute_code(w, &method_identifier, &type_identifier) } - false => unimplemented!(), + false => unimplemented!("tunnel-password"), }, RadiusAttributeValueType::Octets => match attr.has_tag { - true => unimplemented!(), + true => unimplemented!("tagged-octets"), false => generate_octets_attribute_code(w, &method_identifier, &type_identifier), }, RadiusAttributeValueType::IpAddr => match attr.has_tag { - true => unimplemented!(), + true => unimplemented!("tagged-ip-addr"), false => generate_ipaddr_attribute_code(w, &method_identifier, &type_identifier), }, + RadiusAttributeValueType::Date => match attr.has_tag { + true => unimplemented!("tagged-date"), + false => generate_date_attribute_code(w, &method_identifier, &type_identifier), + }, RadiusAttributeValueType::Integer => { match value_defined_attributes_set.contains(&attr_name) { true => match attr.has_tag { @@ -414,6 +422,32 @@ pub fn lookup_all_{method_identifier}(packet: &Packet) -> Result, w.write_all(code.as_bytes()).unwrap(); } +fn generate_date_attribute_code( + w: &mut BufWriter, + method_identifier: &str, + type_identifier: &str, +) { + let code = format!( + "pub fn add_{method_identifier}(packet: &mut Packet, value: &DateTime) {{ + packet.add(AVP::from_date({type_identifier}, value)); +}} +pub fn lookup_{method_identifier}(packet: &Packet) -> Option, AVPError>> {{ + packet.lookup({type_identifier}).map(|v| v.encode_date()) +}} +pub fn lookup_all_{method_identifier}(packet: &Packet) -> Result>, AVPError> {{ + let mut vec = Vec::new(); + for avp in packet.lookup_all({type_identifier}) {{ + vec.push(avp.encode_date()?) + }} + Ok(vec) +}} +", + method_identifier = method_identifier, + type_identifier = type_identifier, + ); + w.write_all(code.as_bytes()).unwrap(); +} + fn generate_integer_attribute_code( w: &mut BufWriter, method_identifier: &str,