Skip to content

Commit cf617dc

Browse files
committed
Support Component Analysis
1 parent e056af6 commit cf617dc

File tree

2 files changed

+262
-0
lines changed

2 files changed

+262
-0
lines changed

smarty-rust-sdk/src/us_street_api/candidate.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,29 @@ pub struct Analysis {
8383
pub suitelink_match: bool,
8484
pub ews_match: bool,
8585
pub enhanced_match: String,
86+
pub components: ComponentAnalysis,
87+
}
88+
89+
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
90+
pub struct MatchInfo {
91+
pub status: String,
92+
pub change: Vec<String>,
93+
}
94+
95+
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
96+
pub struct ComponentAnalysis {
97+
pub primary_number: MatchInfo,
98+
pub street_predirection: MatchInfo,
99+
pub street_name: MatchInfo,
100+
pub street_postdirection: MatchInfo,
101+
pub street_suffix: MatchInfo,
102+
pub secondary_number: MatchInfo,
103+
pub secondary_designator: MatchInfo,
104+
pub extra_secondary_number: MatchInfo,
105+
pub extra_secondary_designator: MatchInfo,
106+
pub city_name: MatchInfo,
107+
pub state_abbreviation: MatchInfo,
108+
pub zipcode: MatchInfo,
109+
pub plus4_code: MatchInfo,
110+
pub urbanization: MatchInfo,
86111
}

smarty-rust-sdk/src/us_street_api/mod.rs

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ mod tests {
99
use crate::sdk::options::OptionsBuilder;
1010
use crate::us_street_api::client::USStreetAddressClient;
1111
use crate::us_street_api::lookup::{Lookup, MatchStrategy};
12+
use serde_json::json;
13+
use crate::us_street_api::candidate::Candidate;
1214

1315
#[test]
1416
fn client_test() {
@@ -71,4 +73,239 @@ mod tests {
7173
);
7274
assert_eq!(batch.records().len(), 4);
7375
}
76+
77+
#[test]
78+
fn full_candidate_test_with_top_level_fields() {
79+
let data = json!({
80+
"input_id": "1234",
81+
"candidate_index": 0,
82+
"delivery_line_1": "1600 Amphitheatre Pkwy",
83+
"delivery_line_2": "Ste 100",
84+
"last_line": "Mountain View CA 94043-1351",
85+
"delivery_point_barcode": "940431351000",
86+
"components": {
87+
"urbanization": "URB",
88+
"primary_number": "1600",
89+
"street_name": "Amphitheatre",
90+
"street_predirection": "N",
91+
"street_postdirection": "W",
92+
"street_suffix": "Pkwy",
93+
"secondary_number": "100",
94+
"secondary_designator": "Ste",
95+
"extra_secondary_number": "200",
96+
"extra_secondary_designator": "Apt",
97+
"pmb_designator": "PMB",
98+
"pmb_number": "300",
99+
"city_name": "Mountain View",
100+
"default_city_name": "Mountain View",
101+
"state_abbreviation": "CA",
102+
"zipcode": "94043",
103+
"plus4_code": "1351",
104+
"delivery_point": "00",
105+
"delivery_point_check_digit": "1"
106+
},
107+
"metadata": {
108+
"record_type": "S",
109+
"zip_type": "Standard",
110+
"county_fips": "06085",
111+
"county_name": "Santa Clara",
112+
"carrier_route": "C001",
113+
"congressional_district": "18",
114+
"building_default_indicator": "Y",
115+
"rdi": "Residential",
116+
"elot_sequence": "0056",
117+
"elot_sort": "A",
118+
"latitude": 37.422,
119+
"longitude": -122.084,
120+
"precision": "Zip9",
121+
"time_zone": "Pacific",
122+
"utc_offset": -8.0,
123+
"dst": true,
124+
"ews_match": false
125+
},
126+
"analysis": {
127+
"dpv_match_code": "Y",
128+
"dpv_footnotes": "AABB",
129+
"dpv_cmra": "N",
130+
"dpv_vacant": "N",
131+
"dpv_no_stat": "N",
132+
"active": "Y",
133+
"ews_match": false,
134+
"footnotes": "N#",
135+
"lacslink_code": "L",
136+
"lacslink_indicator": "Y",
137+
"suitelink_match": true,
138+
"enhanced_match": "Y",
139+
"components": {
140+
"primary_number": {
141+
"status": "confirmed",
142+
"change": ["added"]
143+
},
144+
"street_predirection": {
145+
"status": "unconfirmed",
146+
"change": ["spelling"]
147+
},
148+
"street_name": {
149+
"status": "confirmed",
150+
"change": ["replaced"]
151+
},
152+
"street_postdirection": {
153+
"status": "confirmed",
154+
"change": []
155+
},
156+
"street_suffix": {
157+
"status": "confirmed",
158+
"change": ["spelling"]
159+
},
160+
"secondary_number": {
161+
"status": "unconfirmed",
162+
"change": ["added"]
163+
},
164+
"secondary_designator": {
165+
"status": "confirmed",
166+
"change": ["replaced"]
167+
},
168+
"extra_secondary_number": {
169+
"status": "confirmed",
170+
"change": ["spelling"]
171+
},
172+
"extra_secondary_designator": {
173+
"status": "confirmed",
174+
"change": ["added"]
175+
},
176+
"city_name": {
177+
"status": "unconfirmed",
178+
"change": ["replaced"]
179+
},
180+
"state_abbreviation": {
181+
"status": "confirmed",
182+
"change": []
183+
},
184+
"zipcode": {
185+
"status": "confirmed",
186+
"change": ["spelling"]
187+
},
188+
"plus4_code": {
189+
"status": "confirmed",
190+
"change": ["added"]
191+
},
192+
"urbanization": {
193+
"status": "unconfirmed",
194+
"change": []
195+
}
196+
}
197+
}
198+
});
199+
200+
let candidate: Candidate = serde_json::from_value(data).unwrap();
201+
202+
// Top-level
203+
assert_eq!(candidate.input_id, "1234");
204+
assert_eq!(candidate.candidate_index, 0);
205+
assert_eq!(candidate.delivery_line_1, "1600 Amphitheatre Pkwy");
206+
assert_eq!(candidate.delivery_line_2, "Ste 100");
207+
assert_eq!(candidate.last_line, "Mountain View CA 94043-1351");
208+
assert_eq!(candidate.delivery_point_barcode, "940431351000");
209+
210+
// Components
211+
let c = &candidate.components;
212+
assert_eq!(c.urbanization, "URB");
213+
assert_eq!(c.primary_number, "1600");
214+
assert_eq!(c.street_name, "Amphitheatre");
215+
assert_eq!(c.street_predirection, "N");
216+
assert_eq!(c.street_postdirection, "W");
217+
assert_eq!(c.street_suffix, "Pkwy");
218+
assert_eq!(c.secondary_number, "100");
219+
assert_eq!(c.secondary_designator, "Ste");
220+
assert_eq!(c.extra_secondary_number, "200");
221+
assert_eq!(c.extra_secondary_designator, "Apt");
222+
assert_eq!(c.pmb_designator, "PMB");
223+
assert_eq!(c.pmb_number, "300");
224+
assert_eq!(c.city_name, "Mountain View");
225+
assert_eq!(c.default_city_name, "Mountain View");
226+
assert_eq!(c.state_abbreviation, "CA");
227+
assert_eq!(c.zipcode, "94043");
228+
assert_eq!(c.plus4_code, "1351");
229+
assert_eq!(c.delivery_point, "00");
230+
assert_eq!(c.delivery_point_check_digit, "1");
231+
232+
// Metadata
233+
let m = &candidate.metadata;
234+
assert_eq!(m.record_type, "S");
235+
assert_eq!(m.zip_type, "Standard");
236+
assert_eq!(m.county_fips, "06085");
237+
assert_eq!(m.county_name, "Santa Clara");
238+
assert_eq!(m.carrier_route, "C001");
239+
assert_eq!(m.congressional_district, "18");
240+
assert_eq!(m.building_default_indicator, "Y");
241+
assert_eq!(m.rdi, "Residential");
242+
assert_eq!(m.elot_sequence, "0056");
243+
assert_eq!(m.elot_sort, "A");
244+
assert_eq!(m.latitude, 37.422);
245+
assert_eq!(m.longitude, -122.084);
246+
assert_eq!(m.precision, "Zip9");
247+
assert_eq!(m.time_zone, "Pacific");
248+
assert_eq!(m.utc_offset, -8.0);
249+
assert!(m.dst);
250+
assert!(!m.ews_match);
251+
252+
// Analysis
253+
let a = &candidate.analysis;
254+
assert_eq!(a.dpv_match_code, "Y");
255+
assert_eq!(a.dpv_footnotes, "AABB");
256+
assert_eq!(a.dpv_cmra, "N");
257+
assert_eq!(a.dpv_vacant, "N");
258+
assert_eq!(a.active, "Y");
259+
assert!(!a.ews_match);
260+
assert_eq!(a.footnotes, "N#");
261+
assert_eq!(a.lacslink_code, "L");
262+
assert_eq!(a.lacslink_indicator, "Y");
263+
assert!(a.suitelink_match);
264+
assert_eq!(a.dpv_no_stat, "N");
265+
assert_eq!(a.enhanced_match, "Y");
266+
267+
// Component Analysis (nested)
268+
let ca = &a.components;
269+
assert_eq!(ca.primary_number.status, "confirmed");
270+
assert_eq!(ca.primary_number.change, vec!["added"]);
271+
272+
assert_eq!(ca.street_predirection.status, "unconfirmed");
273+
assert_eq!(ca.street_predirection.change, vec!["spelling"]);
274+
275+
assert_eq!(ca.street_name.status, "confirmed");
276+
assert_eq!(ca.street_name.change, vec!["replaced"]);
277+
278+
assert_eq!(ca.street_postdirection.status, "confirmed");
279+
assert!(ca.street_postdirection.change.is_empty());
280+
281+
assert_eq!(ca.street_suffix.status, "confirmed");
282+
assert_eq!(ca.street_suffix.change, vec!["spelling"]);
283+
284+
assert_eq!(ca.secondary_number.status, "unconfirmed");
285+
assert_eq!(ca.secondary_number.change, vec!["added"]);
286+
287+
assert_eq!(ca.secondary_designator.status, "confirmed");
288+
assert_eq!(ca.secondary_designator.change, vec!["replaced"]);
289+
290+
assert_eq!(ca.extra_secondary_number.status, "confirmed");
291+
assert_eq!(ca.extra_secondary_number.change, vec!["spelling"]);
292+
293+
assert_eq!(ca.extra_secondary_designator.status, "confirmed");
294+
assert_eq!(ca.extra_secondary_designator.change, vec!["added"]);
295+
296+
assert_eq!(ca.city_name.status, "unconfirmed");
297+
assert_eq!(ca.city_name.change, vec!["replaced"]);
298+
299+
assert_eq!(ca.state_abbreviation.status, "confirmed");
300+
assert!(ca.state_abbreviation.change.is_empty());
301+
302+
assert_eq!(ca.zipcode.status, "confirmed");
303+
assert_eq!(ca.zipcode.change, vec!["spelling"]);
304+
305+
assert_eq!(ca.plus4_code.status, "confirmed");
306+
assert_eq!(ca.plus4_code.change, vec!["added"]);
307+
308+
assert_eq!(ca.urbanization.status, "unconfirmed");
309+
assert!(ca.urbanization.change.is_empty());
310+
}
74311
}

0 commit comments

Comments
 (0)