@@ -5,16 +5,22 @@ use crate::api::AsyncApi;
55use crate :: api:: BlockingApi ;
66use crate :: entity:: { Address , ParseResult } ;
77use crate :: err:: { Error , ParseErrorKind } ;
8- use crate :: parser:: read_city:: read_city;
9- use crate :: parser:: read_prefecture:: read_prefecture;
10- use crate :: parser:: read_town:: read_town;
8+ use crate :: tokenizer:: Tokenizer ;
119
12- mod adapter;
13- mod filter;
14- mod read_city;
10+ pub ( crate ) mod adapter;
11+ pub ( crate ) mod filter;
1512mod read_house_number;
16- mod read_prefecture;
17- mod read_town;
13+
14+ impl < T > From < Tokenizer < T > > for Address {
15+ fn from ( value : Tokenizer < T > ) -> Self {
16+ Self {
17+ prefecture : value. prefecture_name . unwrap_or ( "" . to_string ( ) ) ,
18+ city : value. city_name . unwrap_or ( "" . to_string ( ) ) ,
19+ town : value. town_name . unwrap_or ( "" . to_string ( ) ) ,
20+ rest : value. rest ,
21+ }
22+ }
23+ }
1824
1925/// An asynchronous `Parser` to process addresses.
2026///
@@ -69,56 +75,61 @@ impl Parser {
6975///
7076/// publicにしていますが、直接の使用は推奨されません。[Parser]の利用を検討してください。
7177pub async fn parse ( api : Arc < AsyncApi > , input : & str ) -> ParseResult {
78+ let tokenizer = Tokenizer :: new ( input) ;
7279 // 都道府県を特定
73- let ( rest, prefecture_name) = if let Some ( result) = read_prefecture ( input) {
74- result
75- } else {
80+ let Ok ( tokenizer) = tokenizer. read_prefecture ( ) else {
7681 return ParseResult {
77- address : Address :: new ( "" , "" , "" , input ) ,
82+ address : Address :: from ( tokenizer ) ,
7883 error : Some ( Error :: new_parse_error ( ParseErrorKind :: Prefecture ) ) ,
7984 } ;
8085 } ;
8186 // その都道府県の市町村名リストを取得
82- let prefecture = match api. get_prefecture_master ( prefecture_name) . await {
87+ let prefecture = match api
88+ . get_prefecture_master ( tokenizer. prefecture_name . as_ref ( ) . unwrap ( ) )
89+ . await
90+ {
8391 Err ( error) => {
8492 return ParseResult {
85- address : Address :: new ( prefecture_name , "" , "" , rest ) ,
93+ address : Address :: from ( tokenizer ) ,
8694 error : Some ( error) ,
8795 } ;
8896 }
8997 Ok ( result) => result,
9098 } ;
9199 // 市町村名を特定
92- let ( rest, city_name) = if let Some ( result) = read_city ( rest, prefecture) {
93- result
94- } else {
100+ let Ok ( tokenizer) = tokenizer. read_city ( prefecture. cities ) else {
95101 return ParseResult {
96- address : Address :: new ( prefecture_name , "" , "" , rest ) ,
102+ address : Address :: from ( tokenizer ) ,
97103 error : Some ( Error :: new_parse_error ( ParseErrorKind :: City ) ) ,
98104 } ;
99105 } ;
100106 // その市町村の町名リストを取得
101- let city = match api. get_city_master ( prefecture_name, & city_name) . await {
107+ let city = match api
108+ . get_city_master (
109+ tokenizer. prefecture_name . as_ref ( ) . unwrap ( ) ,
110+ tokenizer. city_name . as_ref ( ) . unwrap ( ) ,
111+ )
112+ . await
113+ {
102114 Err ( error) => {
103115 return ParseResult {
104- address : Address :: new ( prefecture_name , & city_name , "" , & rest ) ,
116+ address : Address :: from ( tokenizer ) ,
105117 error : Some ( error) ,
106118 } ;
107119 }
108120 Ok ( result) => result,
109121 } ;
110122 // 町名を特定
111- let ( rest, town_name) = if let Some ( result) = read_town ( & rest, & city) {
112- result
113- } else {
123+ let Ok ( tokenizer) = tokenizer. read_town ( city. towns . iter ( ) . map ( |x| x. name . clone ( ) ) . collect ( ) )
124+ else {
114125 return ParseResult {
115- address : Address :: new ( prefecture_name , & city_name , "" , & rest ) ,
126+ address : Address :: from ( tokenizer ) ,
116127 error : Some ( Error :: new_parse_error ( ParseErrorKind :: Town ) ) ,
117128 } ;
118129 } ;
119130
120131 ParseResult {
121- address : Address :: new ( prefecture_name , & city_name , & town_name , & rest ) ,
132+ address : Address :: from ( tokenizer ) ,
122133 error : None ,
123134 }
124135}
@@ -226,54 +237,50 @@ mod tests {
226237/// publicにしていますが、直接の使用は推奨されません。[Parser]の利用を検討してください。
227238#[ cfg( feature = "blocking" ) ]
228239pub fn parse_blocking ( api : Arc < BlockingApi > , input : & str ) -> ParseResult {
229- let ( rest, prefecture_name) = match read_prefecture ( input) {
230- None => {
231- return ParseResult {
232- address : Address :: new ( "" , "" , "" , input) ,
233- error : Some ( Error :: new_parse_error ( ParseErrorKind :: Prefecture ) ) ,
234- } ;
235- }
236- Some ( result) => result,
240+ let tokenizer = Tokenizer :: new ( input) ;
241+ let Ok ( tokenizer) = tokenizer. read_prefecture ( ) else {
242+ return ParseResult {
243+ address : Address :: from ( tokenizer) ,
244+ error : Some ( Error :: new_parse_error ( ParseErrorKind :: Prefecture ) ) ,
245+ } ;
237246 } ;
238- let prefecture = match api. get_prefecture_master ( prefecture_name) {
247+ let prefecture = match api. get_prefecture_master ( tokenizer . prefecture_name . as_ref ( ) . unwrap ( ) ) {
239248 Err ( error) => {
240249 return ParseResult {
241- address : Address :: new ( prefecture_name , "" , "" , rest ) ,
250+ address : Address :: from ( tokenizer ) ,
242251 error : Some ( error) ,
243252 } ;
244253 }
245254 Ok ( result) => result,
246255 } ;
247- let ( rest, city_name) = match read_city ( rest, prefecture) {
248- None => {
249- return ParseResult {
250- address : Address :: new ( prefecture_name, "" , "" , rest) ,
251- error : Some ( Error :: new_parse_error ( ParseErrorKind :: City ) ) ,
252- } ;
253- }
254- Some ( result) => result,
256+ let Ok ( tokenizer) = tokenizer. read_city ( prefecture. cities ) else {
257+ return ParseResult {
258+ address : Address :: from ( tokenizer) ,
259+ error : Some ( Error :: new_parse_error ( ParseErrorKind :: City ) ) ,
260+ } ;
255261 } ;
256- let city = match api. get_city_master ( prefecture_name, & city_name) {
262+ let city = match api. get_city_master (
263+ tokenizer. prefecture_name . as_ref ( ) . unwrap ( ) ,
264+ tokenizer. city_name . as_ref ( ) . unwrap ( ) ,
265+ ) {
257266 Err ( error) => {
258267 return ParseResult {
259- address : Address :: new ( prefecture_name , & city_name , "" , & rest ) ,
268+ address : Address :: from ( tokenizer ) ,
260269 error : Some ( error) ,
261270 } ;
262271 }
263272 Ok ( result) => result,
264273 } ;
265- let ( rest, town_name) = match read_town ( & rest, & city) {
266- None => {
267- return ParseResult {
268- address : Address :: new ( prefecture_name, & city_name, "" , & rest) ,
269- error : Some ( Error :: new_parse_error ( ParseErrorKind :: Town ) ) ,
270- } ;
271- }
272- Some ( result) => result,
274+ let Ok ( tokenizer) = tokenizer. read_town ( city. towns . iter ( ) . map ( |x| x. name . clone ( ) ) . collect ( ) )
275+ else {
276+ return ParseResult {
277+ address : Address :: from ( tokenizer) ,
278+ error : Some ( Error :: new_parse_error ( ParseErrorKind :: Town ) ) ,
279+ } ;
273280 } ;
274281
275282 ParseResult {
276- address : Address :: new ( prefecture_name , & city_name , & town_name , & rest ) ,
283+ address : Address :: from ( tokenizer ) ,
277284 error : None ,
278285 }
279286}
0 commit comments