From 7a7b1a7ad5a7d03ac10b17708558de2b7c48c203 Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Tue, 9 Apr 2024 10:24:18 +0530 Subject: [PATCH] use an enum to replace a tuple to make the code easy to read --- src/graphql.rs | 9 ++++----- src/sql_types.rs | 38 +++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/graphql.rs b/src/graphql.rs index 66810a31..a13e14f5 100644 --- a/src/graphql.rs +++ b/src/graphql.rs @@ -1374,11 +1374,10 @@ fn function_args(schema: &Arc<__Schema>, func: &Arc) -> Vec<__InputVal }) }) .map(|(arg_type, arg_name, arg_default)| { - let default_value = if let Some((default_value, is_null)) = arg_default { - if is_null { - None - } else { - Some(default_value) + let default_value = if let Some(default_value) = arg_default { + match default_value { + DefaultValue::Value(value) => Some(value), + DefaultValue::Null => None, } } else { None diff --git a/src/sql_types.rs b/src/sql_types.rs index 5c1696f5..3150e4a7 100644 --- a/src/sql_types.rs +++ b/src/sql_types.rs @@ -88,7 +88,7 @@ pub struct Function { } impl Function { - pub fn args(&self) -> impl Iterator, Option<(String, bool)>)> { + pub fn args(&self) -> impl Iterator, Option)> { ArgsIterator::new( &self.arg_types, &self.arg_type_names, @@ -200,7 +200,13 @@ struct ArgsIterator<'a> { arg_types: &'a [u32], arg_type_names: &'a Vec, arg_names: &'a Option>, - arg_defaults: Vec>, + arg_defaults: Vec>, +} + +#[derive(Clone)] +pub(crate) enum DefaultValue { + Value(String), + Null, } impl<'a> ArgsIterator<'a> { @@ -230,7 +236,7 @@ impl<'a> ArgsIterator<'a> { arg_defaults: &'a Option, num_default_args: usize, num_total_args: usize, - ) -> Vec> { + ) -> Vec> { let mut defaults = vec![None; num_total_args]; let Some(arg_defaults) = arg_defaults else { return defaults; @@ -255,20 +261,26 @@ impl<'a> ArgsIterator<'a> { defaults } - fn sql_to_graphql_default(default_str: &str, type_oid: u32) -> Option<(String, bool)> { + fn sql_to_graphql_default(default_str: &str, type_oid: u32) -> Option { let trimmed = default_str.trim(); if trimmed.starts_with("NULL::") { - return Some(("".to_string(), true)); + return Some(DefaultValue::Null); } match type_oid { - 21 | 23 => trimmed.parse::().ok().map(|i| (i.to_string(), false)), - 16 => trimmed.parse::().ok().map(|i| (i.to_string(), false)), - 700 | 701 => trimmed.parse::().ok().map(|i| (i.to_string(), false)), + 21 | 23 => trimmed + .parse::() + .ok() + .map(|i| DefaultValue::Value(i.to_string())), + 16 => trimmed + .parse::() + .ok() + .map(|i| DefaultValue::Value(i.to_string())), + 700 | 701 => trimmed + .parse::() + .ok() + .map(|i| DefaultValue::Value(i.to_string())), 25 => trimmed.strip_suffix("::text").map(|i| { - ( - format!("\"{}\"", i.trim_matches(',').trim_matches('\'')), - false, - ) + DefaultValue::Value(format!("\"{}\"", i.trim_matches(',').trim_matches('\''))) }), _ => None, } @@ -280,7 +292,7 @@ lazy_static! { } impl<'a> Iterator for ArgsIterator<'a> { - type Item = (u32, &'a str, Option<&'a str>, Option<(String, bool)>); + type Item = (u32, &'a str, Option<&'a str>, Option); fn next(&mut self) -> Option { if self.index < self.arg_types.len() {