use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION};
use crate::{KenallError, PostalCodeResponse};
const BASE_URL: &str = "https://api.kenall.jp/v1/postalcode";
fn construct_headers() -> HeaderMap {
let mut headers = HeaderMap::new();
let api_key = dotenv::var("API_KEY").expect("API_KEY must be set");
let token = format!("Token {}", api_key);
headers.insert(AUTHORIZATION, HeaderValue::from_str(&token).unwrap());
headers
}
pub fn fetch_address(postal_code: &str) -> Result<PostalCodeResponse, KenallError> {
let endpoint = format!("{}/{}", BASE_URL, postal_code);
let client = reqwest::blocking::Client::new();
let result = client
.get(&endpoint)
.headers(construct_headers())
.send()?
.json::<PostalCodeResponse>()?;
Ok(result)
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
#[test]
fn standard_postalcode_with_corporation() {
let postal_code = "1008105";
let address = r#"
{
"version": "2021-01-29",
"data": [
{
"jisx0402": "13101",
"old_code": "100",
"postal_code": "1008105",
"prefecture_kana": "",
"city_kana": "",
"town_kana": "",
"town_kana_raw": "",
"prefecture": "東京都",
"city": "千代田区",
"town": "大手町",
"koaza": "",
"kyoto_street": "",
"building": "",
"floor": "",
"town_partial": false,
"town_addressed_koaza": false,
"town_chome": false,
"town_multi": false,
"town_raw": "大手町",
"corporation": {
"name": "チッソ 株式会社",
"name_kana": "チツソ カブシキガイシヤ",
"block_lot": "2丁目2-1(新大手町ビル)",
"post_office": "銀座",
"code_type": 0
}
}
]
}
"#;
let address_object: PostalCodeResponse = serde_json::from_str(address).unwrap();
let result = fetch_address(postal_code).unwrap();
assert_eq!(result, address_object);
}
#[test]
fn koaza_exception() {
let postal_code = "4850801";
let result = fetch_address(postal_code).unwrap();
assert_eq!(result.data[0].koaza, "");
}
#[test]
fn separated_block() {
let postal_code = "0282504";
let result = fetch_address(postal_code).unwrap();
assert_eq!(result.data[0].koaza, "第2地割");
assert_eq!(result.data[1].koaza, "第3地割");
assert_eq!(result.data[2].koaza, "第4地割");
}
#[test]
fn include_kyoto_street() {
let postal_code = "6048063";
let result = fetch_address(postal_code).unwrap();
assert_eq!(result.data[1].kyoto_street, "蛸薬師通麸屋町西入");
}
#[test]
fn include_name_of_building_and_floor() {
let postal_code = "1046001";
let result = fetch_address(postal_code).unwrap();
let building = &result.data[0].building;
assert_eq!(building, "オフィスタワーX");
let floor = &result.data[0].floor;
assert_eq!(floor, "1階");
}
#[test]
fn include_individual_corporate_number() {
let postal_code = "1008926";
let result = fetch_address(postal_code).unwrap();
let cooporation = result.data[0].corporation.as_ref().unwrap();
assert_eq!(cooporation.name, "総務省");
assert_eq!(cooporation.code_type, 0);
assert_eq!(cooporation.block_lot, "2丁目1-2");
}
}