Skip to content

Commit fb4a3ed

Browse files
Merge pull request #346 from YuukiToriyama/release/v0.1.5
release/v0.1.5をmainブランチにマージ
2 parents b7e2a45 + b762575 commit fb4a3ed

File tree

13 files changed

+659
-417
lines changed

13 files changed

+659
-417
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ members = [
88
resolver = "2"
99

1010
[workspace.package]
11-
version = "0.1.4"
11+
version = "0.1.5"
1212
edition = "2021"
1313
description = "A Rust Library to parse japanese addresses."
1414
repository = "https://github.com/YuukiToriyama/japanese-address-parser"

core/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,5 @@ reqwest = { version = "0.12.3", default-features = false, features = ["json", "r
2828
serde = { version = "1.0.192", features = ["derive"] }
2929

3030
[dev-dependencies]
31-
test-case = "3.3.1"
3231
tokio = { version = "1.38.0", features = ["rt", "macros"] }
3332
wasm-bindgen-test = { workspace = true }

core/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ pub mod api;
77
pub mod entity;
88
mod err;
99
pub mod parser;
10+
mod tokenizer;
1011
mod util;

core/src/parser.rs

Lines changed: 61 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,22 @@ use crate::api::AsyncApi;
55
use crate::api::BlockingApi;
66
use crate::entity::{Address, ParseResult};
77
use 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;
1512
mod 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]の利用を検討してください。
7177
pub 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")]
228239
pub 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
}

core/src/parser/adapter/orthographical_variant_adapter.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub trait OrthographicalVariants {
2828
const: Variant;
2929
const: Variant;
3030
const: Variant;
31+
const: Variant;
3132
}
3233

3334
impl OrthographicalVariants for Variant {
@@ -53,6 +54,7 @@ impl OrthographicalVariants for Variant {
5354
const: Variant = &["穂", "穗"];
5455
const: Variant = &["梼", "檮"];
5556
const: Variant = &["葛󠄀", "葛"];
57+
const: Variant = &["蛍", "螢"];
5658
}
5759

5860
pub struct OrthographicalVariantAdapter {

core/src/parser/read_city.rs

Lines changed: 0 additions & 86 deletions
This file was deleted.

core/src/parser/read_prefecture.rs

Lines changed: 0 additions & 79 deletions
This file was deleted.

0 commit comments

Comments
 (0)