chore: adjust isbn input
c470d662
1 file(s) · +16 −2
| 49 | 49 | } |
|
| 50 | 50 | ||
| 51 | 51 | pub async fn search(query: &str, api_key: Option<&str>) -> Result<Vec<SearchHit>, String> { |
|
| 52 | - | let q = urlencoding::encode(query.trim()); |
|
| 53 | - | if q.is_empty() { |
|
| 52 | + | let trimmed = query.trim(); |
|
| 53 | + | if trimmed.is_empty() { |
|
| 54 | 54 | return Ok(Vec::new()); |
|
| 55 | 55 | } |
|
| 56 | + | let normalized: String = trimmed |
|
| 57 | + | .chars() |
|
| 58 | + | .filter(|c| !c.is_whitespace() && *c != '-') |
|
| 59 | + | .collect(); |
|
| 60 | + | let is_isbn = matches!(normalized.len(), 10 | 13) |
|
| 61 | + | && normalized |
|
| 62 | + | .chars() |
|
| 63 | + | .all(|c| c.is_ascii_digit() || c == 'X' || c == 'x'); |
|
| 64 | + | let query_str = if is_isbn { |
|
| 65 | + | format!("isbn:{}", normalized.to_uppercase()) |
|
| 66 | + | } else { |
|
| 67 | + | trimmed.to_string() |
|
| 68 | + | }; |
|
| 69 | + | let q = urlencoding::encode(&query_str); |
|
| 56 | 70 | let mut url = format!( |
|
| 57 | 71 | "https://www.googleapis.com/books/v1/volumes?q={q}&maxResults=10&printType=books" |
|
| 58 | 72 | ); |