From c96446bdd827c1675fc1df68ae25683aeb3d59a6 Mon Sep 17 00:00:00 2001 From: Mae Evans Date: Mon, 15 Jun 2026 16:06:07 -0600 Subject: [PATCH 1/8] Fix prefer_cities being dropped from US Autocomplete Pro requests The prefer_city field was declared on the Pro Lookup but never serialized into the request parameters. Emit it as prefer_cities, matching the other SDKs. Co-Authored-By: Claude Opus 4.8 (1M context) --- smarty-rust-sdk/src/us_autocomplete_pro_api/lookup.rs | 1 + smarty-rust-sdk/src/us_autocomplete_pro_api/mod.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/smarty-rust-sdk/src/us_autocomplete_pro_api/lookup.rs b/smarty-rust-sdk/src/us_autocomplete_pro_api/lookup.rs index 49d8ede..a72da9c 100644 --- a/smarty-rust-sdk/src/us_autocomplete_pro_api/lookup.rs +++ b/smarty-rust-sdk/src/us_autocomplete_pro_api/lookup.rs @@ -54,6 +54,7 @@ impl Lookup { has_vec_param("include_only_states".to_string(), ";", self.state_filter), has_vec_param("include_only_zip_codes".to_string(), ";", self.zip_filter), has_vec_param("exclude_states".to_string(), ";", self.exclude_states), + has_vec_param("prefer_cities".to_string(), ";", self.prefer_city), has_vec_param("prefer_states".to_string(), ";", self.prefer_state), has_vec_param("prefer_zip_codes".to_string(), ";", self.prefer_zip), has_param("prefer_ratio".to_string(), self.prefer_ratio), diff --git a/smarty-rust-sdk/src/us_autocomplete_pro_api/mod.rs b/smarty-rust-sdk/src/us_autocomplete_pro_api/mod.rs index a7d22c0..0922a10 100644 --- a/smarty-rust-sdk/src/us_autocomplete_pro_api/mod.rs +++ b/smarty-rust-sdk/src/us_autocomplete_pro_api/mod.rs @@ -25,6 +25,7 @@ mod tests { max_results: 5, city_filter: vec!["Denver,CO".to_string(), "Orem,UT".to_string()], state_filter: vec!["CO".to_string(), "UT".to_string()], + prefer_city: vec!["Denver".to_string()], prefer_state: vec!["CO".to_string()], prefer_ratio: 3, geolocation: Geolocation::GeolocateCity, @@ -41,6 +42,7 @@ mod tests { "Denver,CO;Orem,UT".to_string(), ), ("include_only_states".to_string(), "CO;UT".to_string()), + ("prefer_cities".to_string(), "Denver".to_string()), ("prefer_states".to_string(), "CO".to_string()), ("prefer_ratio".to_string(), "3".to_string()), ("prefer_geolocation".to_string(), "city".to_string()), From ab8bf6c63e5fb82a2a1d522d27583002a6c26d56 Mon Sep 17 00:00:00 2001 From: Mae Evans Date: Mon, 15 Jun 2026 16:06:22 -0600 Subject: [PATCH 2/8] Add US Autocomplete (V2) API client Co-Authored-By: Claude Opus 4.8 (1M context) --- Makefile | 7 +- smarty-rust-sdk/Cargo.toml | 3 + .../examples/us_autocomplete_api.rs | 59 +++++++++++ smarty-rust-sdk/src/lib.rs | 1 + .../src/us_autocomplete_api/client.rs | 17 ++++ .../src/us_autocomplete_api/lookup.rs | 97 +++++++++++++++++++ .../src/us_autocomplete_api/mod.rs | 57 +++++++++++ .../src/us_autocomplete_api/suggestion.rs | 20 ++++ 8 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 smarty-rust-sdk/examples/us_autocomplete_api.rs create mode 100644 smarty-rust-sdk/src/us_autocomplete_api/client.rs create mode 100644 smarty-rust-sdk/src/us_autocomplete_api/lookup.rs create mode 100644 smarty-rust-sdk/src/us_autocomplete_api/mod.rs create mode 100644 smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs diff --git a/Makefile b/Makefile index 2cddd35..f4c38fe 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,9 @@ logger: us_autocomplete_pro_api: RUST_LOG=trace cargo run --example us_autocomplete_pro_api +us_autocomplete_api: + RUST_LOG=trace cargo run --example us_autocomplete_api + us_extract_api: RUST_LOG=trace cargo run --example us_extract_api @@ -68,6 +71,6 @@ us_enrichment_business_name_search_api: integration: cargo test --test us_street_integration -- --ignored -examples: international_autocomplete_api international_postal_code_api international_street_api logger us_autocomplete_pro_api us_extract_api us_reverse_geo_api us_street_api us_zipcode_api us_enrichment_api us_enrichment_address_search_api us_enrichment_business_api us_enrichment_business_name_search_api +examples: international_autocomplete_api international_postal_code_api international_street_api logger us_autocomplete_pro_api us_autocomplete_api us_extract_api us_reverse_geo_api us_street_api us_zipcode_api us_enrichment_api us_enrichment_address_search_api us_enrichment_business_api us_enrichment_business_name_search_api -.PHONY: clean test dependencies package examples clippy integration international_autocomplete_api international_postal_code_api international_street_api logger us_autocomplete_pro_api us_extract_api us_reverse_geo_api us_street_api us_street_iana_timezone us_zipcode_api us_enrichment_api us_enrichment_address_search_api us_enrichment_business_api us_enrichment_business_name_search_api +.PHONY: clean test dependencies package examples clippy integration international_autocomplete_api international_postal_code_api international_street_api logger us_autocomplete_pro_api us_autocomplete_api us_extract_api us_reverse_geo_api us_street_api us_street_iana_timezone us_zipcode_api us_enrichment_api us_enrichment_address_search_api us_enrichment_business_api us_enrichment_business_name_search_api diff --git a/smarty-rust-sdk/Cargo.toml b/smarty-rust-sdk/Cargo.toml index 5349f92..6959bf8 100644 --- a/smarty-rust-sdk/Cargo.toml +++ b/smarty-rust-sdk/Cargo.toml @@ -49,6 +49,9 @@ name = "us_extract_api" [[example]] name = "us_autocomplete_pro_api" +[[example]] +name = "us_autocomplete_api" + [[example]] name = "international_street_api" diff --git a/smarty-rust-sdk/examples/us_autocomplete_api.rs b/smarty-rust-sdk/examples/us_autocomplete_api.rs new file mode 100644 index 0000000..b8d85ad --- /dev/null +++ b/smarty-rust-sdk/examples/us_autocomplete_api.rs @@ -0,0 +1,59 @@ +extern crate serde_json; +extern crate smarty_rust_sdk; +extern crate tokio; + +// This example is for US Autocomplete (V2). It has the same name as a previous product +// which has been deprecated since 2022, which we refer to as US Autocomplete Basic. +// If you are still using US Autocomplete Basic, this SDK will not work. + +use smarty_rust_sdk::sdk::authentication::BasicAuthCredential; +use smarty_rust_sdk::sdk::options::OptionsBuilder; +use smarty_rust_sdk::us_autocomplete_api::client::USAutocompleteClient; +use smarty_rust_sdk::us_autocomplete_api::lookup::{Geolocation, Lookup}; +use std::error::Error; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let lookup = &mut Lookup { + search: "1042 W Center".to_string(), + max_results: 5, + city_filter: vec!["Orem,UT".to_string(), "Madisonville,KY".to_string()], + state_filter: vec!["UT".to_string(), "KY".to_string()], + prefer_state: vec!["KY".to_string()], + prefer_ratio: 3, + geolocation: Geolocation::GeolocateCity, + source: "all".to_string(), + ..Default::default() + }; + + let authentication = BasicAuthCredential::new( + std::env::var("SMARTY_AUTH_ID").expect("Missing SMARTY_AUTH_ID env variable"), + std::env::var("SMARTY_AUTH_TOKEN").expect("Missing SMARTY_AUTH_TOKEN env variable"), + ); + + let options = OptionsBuilder::new(Some(authentication)) + .with_logging() + .build(); + + let client = USAutocompleteClient::new(options)?; + client.send(lookup).await?; + + println!("{}", serde_json::to_string_pretty(&lookup.results)?); + + // Expand the secondaries of a result that has an entry_id by passing it back as the selected address. + if let Some(entry_id) = lookup + .results + .suggestions + .iter() + .find(|suggestion| !suggestion.entry_id.is_empty()) + .map(|suggestion| suggestion.entry_id.clone()) + { + lookup.selected = entry_id; + client.send(lookup).await?; + + println!("Secondaries:"); + println!("{}", serde_json::to_string_pretty(&lookup.results)?); + } + + Ok(()) +} diff --git a/smarty-rust-sdk/src/lib.rs b/smarty-rust-sdk/src/lib.rs index 5a6ffa3..a5287ec 100644 --- a/smarty-rust-sdk/src/lib.rs +++ b/smarty-rust-sdk/src/lib.rs @@ -2,6 +2,7 @@ pub mod international_autocomplete_api; pub mod international_postal_code_api; pub mod international_street_api; pub mod sdk; +pub mod us_autocomplete_api; pub mod us_autocomplete_pro_api; pub mod us_enrichment_api; pub mod us_extract_api; diff --git a/smarty-rust-sdk/src/us_autocomplete_api/client.rs b/smarty-rust-sdk/src/us_autocomplete_api/client.rs new file mode 100644 index 0000000..af587b6 --- /dev/null +++ b/smarty-rust-sdk/src/us_autocomplete_api/client.rs @@ -0,0 +1,17 @@ +use crate::sdk::client::Client; +use crate::sdk::error::SmartyError; +use crate::sdk::options::Options; +use crate::sdk::send_request; +use crate::us_autocomplete_api::lookup::Lookup; +use crate::us_autocomplete_api::suggestion::SuggestionListing; +use reqwest::Method; +use smarty_rust_proc_macro::smarty_api; + +#[smarty_api( + api_path = "v2/lookup", + default_url = "https://us-autocomplete.api.smarty.com/", + lookup_style(lookup), + lookup_type = "Lookup", + result_type = "SuggestionListing" +)] +pub struct USAutocompleteClient; diff --git a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs new file mode 100644 index 0000000..aa9ffca --- /dev/null +++ b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs @@ -0,0 +1,97 @@ +use crate::sdk::{has_param, has_vec_param}; +use crate::us_autocomplete_api::suggestion::SuggestionListing; +use serde::Serialize; + +#[derive(Clone, Debug, PartialEq)] +pub struct Lookup { + pub search: String, + pub source: String, + pub max_results: i32, + pub city_filter: Vec, + pub state_filter: Vec, + pub zip_filter: Vec, + pub exclude_states: Vec, + pub prefer_city: Vec, + pub prefer_state: Vec, + pub prefer_zip: Vec, + pub prefer_ratio: i32, + pub geolocation: Geolocation, + pub selected: String, + pub exclude: String, + + pub results: SuggestionListing, +} + +impl Default for Lookup { + fn default() -> Self { + Lookup { + search: String::default(), + source: String::default(), + max_results: 0, + city_filter: vec![], + state_filter: vec![], + zip_filter: vec![], + exclude_states: vec![], + prefer_city: vec![], + prefer_state: vec![], + prefer_zip: vec![], + prefer_ratio: 0, + geolocation: Geolocation::default(), + selected: String::default(), + exclude: String::default(), + + results: SuggestionListing { + suggestions: vec![], + }, + } + } +} + +impl Lookup { + pub(crate) fn into_param_array(self) -> Vec<(String, String)> { + let geolocation_self = self.clone(); + [ + has_param("search".to_string(), self.search), + has_param("source".to_string(), self.source), + has_param("max_results".to_string(), self.max_results), + has_vec_param("include_only_cities".to_string(), ";", self.city_filter), + has_vec_param("include_only_states".to_string(), ";", self.state_filter), + has_vec_param("include_only_zip_codes".to_string(), ";", self.zip_filter), + has_vec_param("exclude_states".to_string(), ";", self.exclude_states), + has_vec_param("prefer_cities".to_string(), ";", self.prefer_city), + has_vec_param("prefer_states".to_string(), ";", self.prefer_state), + has_vec_param("prefer_zip_codes".to_string(), ";", self.prefer_zip), + has_param("prefer_ratio".to_string(), self.prefer_ratio), + geolocation_self.geolocation_param(), + has_param("selected".to_string(), self.selected), + has_param("exclude".to_string(), self.exclude), + ] + .iter() + .filter_map(Option::clone) + .collect::>() + } + + fn geolocation_param(self) -> Option<(String, String)> { + if !self.zip_filter.is_empty() || !self.prefer_zip.is_empty() { + return Some(("prefer_geolocation".to_string(), "none".to_string())); + } + + match self.geolocation { + Geolocation::GeolocateCity => { + Some(("prefer_geolocation".to_string(), "city".to_string())) + } + Geolocation::GeolocateNone => { + Some(("prefer_geolocation".to_string(), "none".to_string())) + } + } + } +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize)] +pub enum Geolocation { + #[default] + #[serde(rename = "none")] + GeolocateNone, + #[serde(rename = "city")] + GeolocateCity, +} diff --git a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs new file mode 100644 index 0000000..836b286 --- /dev/null +++ b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs @@ -0,0 +1,57 @@ +pub mod client; +pub mod lookup; +pub mod suggestion; + +#[cfg(test)] +mod tests { + use crate::sdk::options::OptionsBuilder; + use crate::us_autocomplete_api::client::USAutocompleteClient; + use crate::us_autocomplete_api::lookup::{Geolocation, Lookup}; + + #[test] + fn client_test() { + let client = USAutocompleteClient::new(OptionsBuilder::new(None).build()).unwrap(); + + assert_eq!( + client.client.url.to_string(), + "https://us-autocomplete.api.smarty.com/v2/lookup".to_string() + ) + } + + #[test] + fn lookup_test() { + let lookup = Lookup { + search: "1042 W Center".to_string(), + max_results: 5, + city_filter: vec!["Denver,CO".to_string(), "Orem,UT".to_string()], + state_filter: vec!["CO".to_string(), "UT".to_string()], + prefer_city: vec!["Denver".to_string()], + prefer_state: vec!["CO".to_string()], + prefer_ratio: 3, + geolocation: Geolocation::GeolocateCity, + source: "all".to_string(), + selected: "selectedAddress".to_string(), + exclude: "excludedAddress".to_string(), + ..Default::default() + }; + + let expected_results = vec![ + ("search".to_string(), "1042 W Center".to_string()), + ("source".to_string(), "all".to_string()), + ("max_results".to_string(), "5".to_string()), + ( + "include_only_cities".to_string(), + "Denver,CO;Orem,UT".to_string(), + ), + ("include_only_states".to_string(), "CO;UT".to_string()), + ("prefer_cities".to_string(), "Denver".to_string()), + ("prefer_states".to_string(), "CO".to_string()), + ("prefer_ratio".to_string(), "3".to_string()), + ("prefer_geolocation".to_string(), "city".to_string()), + ("selected".to_string(), "selectedAddress".to_string()), + ("exclude".to_string(), "excludedAddress".to_string()), + ]; + + assert_eq!(lookup.into_param_array(), expected_results) + } +} diff --git a/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs b/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs new file mode 100644 index 0000000..2772587 --- /dev/null +++ b/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs @@ -0,0 +1,20 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct SuggestionListing { + pub suggestions: Vec, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct Suggestion { + pub smarty_key: String, + pub entry_id: String, + pub street_line: String, + pub secondary: String, + pub city: String, + pub state: String, + pub zipcode: String, + pub entries: i32, +} From 35d8e1007ef6e30b26177768b4c0a9af9a0406d5 Mon Sep 17 00:00:00 2001 From: Mae Evans Date: Wed, 17 Jun 2026 15:27:46 -0600 Subject: [PATCH 3/8] added documentation link to example --- smarty-rust-sdk/examples/us_autocomplete_api.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smarty-rust-sdk/examples/us_autocomplete_api.rs b/smarty-rust-sdk/examples/us_autocomplete_api.rs index b8d85ad..c7899f9 100644 --- a/smarty-rust-sdk/examples/us_autocomplete_api.rs +++ b/smarty-rust-sdk/examples/us_autocomplete_api.rs @@ -14,6 +14,10 @@ use std::error::Error; #[tokio::main] async fn main() -> Result<(), Box> { + + // Documentation for input fields can be found at: + // https://www.smarty.com/docs/apis/us-autocomplete-v2/reference#http-request-input-fields + let lookup = &mut Lookup { search: "1042 W Center".to_string(), max_results: 5, From 589c17488764fbed6378c4ee49ab2b0c66f2dce1 Mon Sep 17 00:00:00 2001 From: Andrea Wait Date: Thu, 18 Jun 2026 11:55:54 -0600 Subject: [PATCH 4/8] Refactored source into enum --- .../examples/us_autocomplete_api.rs | 5 ++- smarty-rust-sdk/src/sdk/retry_strategy.rs | 5 ++- .../src/us_autocomplete_api/lookup.rs | 31 ++++++++++++++++--- .../src/us_autocomplete_api/mod.rs | 29 +++++++++++++++-- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/smarty-rust-sdk/examples/us_autocomplete_api.rs b/smarty-rust-sdk/examples/us_autocomplete_api.rs index c7899f9..14cfc04 100644 --- a/smarty-rust-sdk/examples/us_autocomplete_api.rs +++ b/smarty-rust-sdk/examples/us_autocomplete_api.rs @@ -9,12 +9,11 @@ extern crate tokio; use smarty_rust_sdk::sdk::authentication::BasicAuthCredential; use smarty_rust_sdk::sdk::options::OptionsBuilder; use smarty_rust_sdk::us_autocomplete_api::client::USAutocompleteClient; -use smarty_rust_sdk::us_autocomplete_api::lookup::{Geolocation, Lookup}; +use smarty_rust_sdk::us_autocomplete_api::lookup::{Geolocation, Lookup, Source}; use std::error::Error; #[tokio::main] async fn main() -> Result<(), Box> { - // Documentation for input fields can be found at: // https://www.smarty.com/docs/apis/us-autocomplete-v2/reference#http-request-input-fields @@ -26,7 +25,7 @@ async fn main() -> Result<(), Box> { prefer_state: vec!["KY".to_string()], prefer_ratio: 3, geolocation: Geolocation::GeolocateCity, - source: "all".to_string(), + source: Some(Source::All), ..Default::default() }; diff --git a/smarty-rust-sdk/src/sdk/retry_strategy.rs b/smarty-rust-sdk/src/sdk/retry_strategy.rs index 2fd1a0e..216cff2 100644 --- a/smarty-rust-sdk/src/sdk/retry_strategy.rs +++ b/smarty-rust-sdk/src/sdk/retry_strategy.rs @@ -98,7 +98,10 @@ fn retry_success(res: &Response) -> RetryResult { classify_response(res.status(), res.headers().get(RETRY_AFTER)) } -fn classify_response(status: StatusCode, retry_after: Option<&reqwest::header::HeaderValue>) -> RetryResult { +fn classify_response( + status: StatusCode, + retry_after: Option<&reqwest::header::HeaderValue>, +) -> RetryResult { if status.is_success() { return RetryResult::Success; } diff --git a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs index aa9ffca..46829a3 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs @@ -1,11 +1,12 @@ use crate::sdk::{has_param, has_vec_param}; use crate::us_autocomplete_api::suggestion::SuggestionListing; use serde::Serialize; +use std::fmt::{Display, Formatter}; #[derive(Clone, Debug, PartialEq)] pub struct Lookup { pub search: String, - pub source: String, + pub source: Option, pub max_results: i32, pub city_filter: Vec, pub state_filter: Vec, @@ -26,7 +27,7 @@ impl Default for Lookup { fn default() -> Self { Lookup { search: String::default(), - source: String::default(), + source: None, max_results: 0, city_filter: vec![], state_filter: vec![], @@ -50,9 +51,8 @@ impl Default for Lookup { impl Lookup { pub(crate) fn into_param_array(self) -> Vec<(String, String)> { let geolocation_self = self.clone(); - [ + let mut result: Vec<(String, String)> = [ has_param("search".to_string(), self.search), - has_param("source".to_string(), self.source), has_param("max_results".to_string(), self.max_results), has_vec_param("include_only_cities".to_string(), ";", self.city_filter), has_vec_param("include_only_states".to_string(), ";", self.state_filter), @@ -68,7 +68,13 @@ impl Lookup { ] .iter() .filter_map(Option::clone) - .collect::>() + .collect::>(); + + if let Some(source) = self.source { + result.push(("source".to_string(), source.to_string())); + } + + result } fn geolocation_param(self) -> Option<(String, String)> { @@ -95,3 +101,18 @@ pub enum Geolocation { #[serde(rename = "city")] GeolocateCity, } + +#[derive(Debug, Clone, PartialEq)] +pub enum Source { + All, + Postal, +} + +impl Display for Source { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + Source::All => write!(f, "all"), + Source::Postal => write!(f, "postal"), + } + } +} diff --git a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs index 836b286..9a6dc62 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs @@ -6,7 +6,7 @@ pub mod suggestion; mod tests { use crate::sdk::options::OptionsBuilder; use crate::us_autocomplete_api::client::USAutocompleteClient; - use crate::us_autocomplete_api::lookup::{Geolocation, Lookup}; + use crate::us_autocomplete_api::lookup::{Geolocation, Lookup, Source}; #[test] fn client_test() { @@ -29,7 +29,7 @@ mod tests { prefer_state: vec!["CO".to_string()], prefer_ratio: 3, geolocation: Geolocation::GeolocateCity, - source: "all".to_string(), + source: Some(Source::All), selected: "selectedAddress".to_string(), exclude: "excludedAddress".to_string(), ..Default::default() @@ -37,7 +37,6 @@ mod tests { let expected_results = vec![ ("search".to_string(), "1042 W Center".to_string()), - ("source".to_string(), "all".to_string()), ("max_results".to_string(), "5".to_string()), ( "include_only_cities".to_string(), @@ -50,8 +49,32 @@ mod tests { ("prefer_geolocation".to_string(), "city".to_string()), ("selected".to_string(), "selectedAddress".to_string()), ("exclude".to_string(), "excludedAddress".to_string()), + ("source".to_string(), "all".to_string()), ]; assert_eq!(lookup.into_param_array(), expected_results) } + + #[test] + fn lookup_excludes_source_when_not_specified() { + let lookup = Lookup { + search: "1042 W Center".to_string(), + ..Default::default() + }; + + let params = lookup.into_param_array(); + assert!(!params.iter().any(|(k, _)| k == "source")); + } + + #[test] + fn lookup_includes_source_postal() { + let lookup = Lookup { + search: "1042 W Center".to_string(), + source: Some(Source::Postal), + ..Default::default() + }; + + let params = lookup.into_param_array(); + assert!(params.iter().any(|(k, v)| k == "source" && v == "postal")); + } } From aa3137abcb85340f3d0cee19c0f4427ab850a052 Mon Sep 17 00:00:00 2001 From: Mae Evans Date: Fri, 19 Jun 2026 10:40:14 -0600 Subject: [PATCH 5/8] geolocation_param copying issue --- smarty-rust-sdk/src/us_autocomplete_api/lookup.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs index aa9ffca..61da77b 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs @@ -49,7 +49,7 @@ impl Default for Lookup { impl Lookup { pub(crate) fn into_param_array(self) -> Vec<(String, String)> { - let geolocation_self = self.clone(); + let geolocation = self.geolocation_param(); [ has_param("search".to_string(), self.search), has_param("source".to_string(), self.source), @@ -62,7 +62,7 @@ impl Lookup { has_vec_param("prefer_states".to_string(), ";", self.prefer_state), has_vec_param("prefer_zip_codes".to_string(), ";", self.prefer_zip), has_param("prefer_ratio".to_string(), self.prefer_ratio), - geolocation_self.geolocation_param(), + geolocation, has_param("selected".to_string(), self.selected), has_param("exclude".to_string(), self.exclude), ] @@ -71,7 +71,7 @@ impl Lookup { .collect::>() } - fn geolocation_param(self) -> Option<(String, String)> { + fn geolocation_param(&self) -> Option<(String, String)> { if !self.zip_filter.is_empty() || !self.prefer_zip.is_empty() { return Some(("prefer_geolocation".to_string(), "none".to_string())); } From ef0b2825f83e1ef5c8b6df9d781c220e62a87ec5 Mon Sep 17 00:00:00 2001 From: Mae Evans Date: Tue, 23 Jun 2026 10:30:59 -0600 Subject: [PATCH 6/8] add source --- smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs b/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs index 2772587..d480668 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/suggestion.rs @@ -17,4 +17,5 @@ pub struct Suggestion { pub state: String, pub zipcode: String, pub entries: i32, + pub source: String, } From d89bc3bbd0fdd76506c05a6bad568fa725a19a44 Mon Sep 17 00:00:00 2001 From: Andy Johnson Date: Tue, 23 Jun 2026 12:02:23 -0600 Subject: [PATCH 7/8] Change exclude to vector. --- .../examples/us_autocomplete_api.rs | 4 ++-- .../src/us_autocomplete_api/lookup.rs | 18 +++++++++--------- smarty-rust-sdk/src/us_autocomplete_api/mod.rs | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/smarty-rust-sdk/examples/us_autocomplete_api.rs b/smarty-rust-sdk/examples/us_autocomplete_api.rs index 14cfc04..a85ed9c 100644 --- a/smarty-rust-sdk/examples/us_autocomplete_api.rs +++ b/smarty-rust-sdk/examples/us_autocomplete_api.rs @@ -9,7 +9,7 @@ extern crate tokio; use smarty_rust_sdk::sdk::authentication::BasicAuthCredential; use smarty_rust_sdk::sdk::options::OptionsBuilder; use smarty_rust_sdk::us_autocomplete_api::client::USAutocompleteClient; -use smarty_rust_sdk::us_autocomplete_api::lookup::{Geolocation, Lookup, Source}; +use smarty_rust_sdk::us_autocomplete_api::lookup::{Lookup, PreferGeolocation, Source}; use std::error::Error; #[tokio::main] @@ -24,7 +24,7 @@ async fn main() -> Result<(), Box> { state_filter: vec!["UT".to_string(), "KY".to_string()], prefer_state: vec!["KY".to_string()], prefer_ratio: 3, - geolocation: Geolocation::GeolocateCity, + prefer_geolocation: PreferGeolocation::GeolocateCity, source: Some(Source::All), ..Default::default() }; diff --git a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs index e539472..e87ba6d 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/lookup.rs @@ -16,9 +16,9 @@ pub struct Lookup { pub prefer_state: Vec, pub prefer_zip: Vec, pub prefer_ratio: i32, - pub geolocation: Geolocation, + pub prefer_geolocation: PreferGeolocation, pub selected: String, - pub exclude: String, + pub exclude: Vec, pub results: SuggestionListing, } @@ -37,9 +37,9 @@ impl Default for Lookup { prefer_state: vec![], prefer_zip: vec![], prefer_ratio: 0, - geolocation: Geolocation::default(), + prefer_geolocation: PreferGeolocation::default(), selected: String::default(), - exclude: String::default(), + exclude: vec![], results: SuggestionListing { suggestions: vec![], @@ -64,7 +64,7 @@ impl Lookup { has_param("prefer_ratio".to_string(), self.prefer_ratio), geolocation, has_param("selected".to_string(), self.selected), - has_param("exclude".to_string(), self.exclude), + has_vec_param("exclude".to_string(), ",", self.exclude), ] .iter() .filter_map(Option::clone) @@ -82,11 +82,11 @@ impl Lookup { return Some(("prefer_geolocation".to_string(), "none".to_string())); } - match self.geolocation { - Geolocation::GeolocateCity => { + match self.prefer_geolocation { + PreferGeolocation::GeolocateCity => { Some(("prefer_geolocation".to_string(), "city".to_string())) } - Geolocation::GeolocateNone => { + PreferGeolocation::GeolocateNone => { Some(("prefer_geolocation".to_string(), "none".to_string())) } } @@ -94,7 +94,7 @@ impl Lookup { } #[derive(Default, Debug, Clone, PartialEq, Serialize)] -pub enum Geolocation { +pub enum PreferGeolocation { #[default] #[serde(rename = "none")] GeolocateNone, diff --git a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs index 9a6dc62..e50682c 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs @@ -6,7 +6,7 @@ pub mod suggestion; mod tests { use crate::sdk::options::OptionsBuilder; use crate::us_autocomplete_api::client::USAutocompleteClient; - use crate::us_autocomplete_api::lookup::{Geolocation, Lookup, Source}; + use crate::us_autocomplete_api::lookup::{Lookup, PreferGeolocation, Source}; #[test] fn client_test() { @@ -28,10 +28,10 @@ mod tests { prefer_city: vec!["Denver".to_string()], prefer_state: vec!["CO".to_string()], prefer_ratio: 3, - geolocation: Geolocation::GeolocateCity, + prefer_geolocation: PreferGeolocation::GeolocateCity, source: Some(Source::All), selected: "selectedAddress".to_string(), - exclude: "excludedAddress".to_string(), + exclude: vec!["excludedAddress".to_string(), "excludedAddress2".to_string()], ..Default::default() }; @@ -48,7 +48,7 @@ mod tests { ("prefer_ratio".to_string(), "3".to_string()), ("prefer_geolocation".to_string(), "city".to_string()), ("selected".to_string(), "selectedAddress".to_string()), - ("exclude".to_string(), "excludedAddress".to_string()), + ("exclude".to_string(), "excludedAddress,excludedAddress2".to_string()), ("source".to_string(), "all".to_string()), ]; From 37cc2480f5f46c2eadd8454317fe5a4e5b4e91a4 Mon Sep 17 00:00:00 2001 From: Andy Johnson Date: Tue, 23 Jun 2026 15:02:29 -0600 Subject: [PATCH 8/8] Run cargo fmt. --- smarty-rust-sdk/src/us_autocomplete_api/mod.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs index e50682c..4a5f964 100644 --- a/smarty-rust-sdk/src/us_autocomplete_api/mod.rs +++ b/smarty-rust-sdk/src/us_autocomplete_api/mod.rs @@ -31,7 +31,10 @@ mod tests { prefer_geolocation: PreferGeolocation::GeolocateCity, source: Some(Source::All), selected: "selectedAddress".to_string(), - exclude: vec!["excludedAddress".to_string(), "excludedAddress2".to_string()], + exclude: vec![ + "excludedAddress".to_string(), + "excludedAddress2".to_string(), + ], ..Default::default() }; @@ -48,7 +51,10 @@ mod tests { ("prefer_ratio".to_string(), "3".to_string()), ("prefer_geolocation".to_string(), "city".to_string()), ("selected".to_string(), "selectedAddress".to_string()), - ("exclude".to_string(), "excludedAddress,excludedAddress2".to_string()), + ( + "exclude".to_string(), + "excludedAddress,excludedAddress2".to_string(), + ), ("source".to_string(), "all".to_string()), ];