|
1 |
| -use std::net::IpAddr; |
| 1 | +use std::net::{IpAddr, Ipv6Addr}; |
2 | 2 | use std::str::FromStr;
|
3 | 3 |
|
4 | 4 | use serde::{Deserialize, Serialize};
|
@@ -320,43 +320,50 @@ impl FieldType {
|
320 | 320 | /// target field is a `Str`, this method will return an Error.
|
321 | 321 | pub fn value_from_json(&self, json: JsonValue) -> Result<Value, ValueParsingError> {
|
322 | 322 | match json {
|
323 |
| - JsonValue::String(field_text) => match self { |
324 |
| - FieldType::Date(_) => { |
325 |
| - let dt_with_fixed_tz = |
326 |
| - OffsetDateTime::parse(&field_text, &Rfc3339).map_err(|_err| { |
327 |
| - ValueParsingError::TypeError { |
| 323 | + JsonValue::String(field_text) => { |
| 324 | + match self { |
| 325 | + FieldType::Date(_) => { |
| 326 | + let dt_with_fixed_tz = OffsetDateTime::parse(&field_text, &Rfc3339) |
| 327 | + .map_err(|_err| ValueParsingError::TypeError { |
328 | 328 | expected: "rfc3339 format",
|
329 | 329 | json: JsonValue::String(field_text),
|
| 330 | + })?; |
| 331 | + Ok(DateTime::from_utc(dt_with_fixed_tz).into()) |
| 332 | + } |
| 333 | + FieldType::Str(_) => Ok(Value::Str(field_text)), |
| 334 | + FieldType::U64(_) | FieldType::I64(_) | FieldType::F64(_) => { |
| 335 | + Err(ValueParsingError::TypeError { |
| 336 | + expected: "an integer", |
| 337 | + json: JsonValue::String(field_text), |
| 338 | + }) |
| 339 | + } |
| 340 | + FieldType::Bool(_) => Err(ValueParsingError::TypeError { |
| 341 | + expected: "a boolean", |
| 342 | + json: JsonValue::String(field_text), |
| 343 | + }), |
| 344 | + FieldType::Facet(_) => Ok(Value::Facet(Facet::from(&field_text))), |
| 345 | + FieldType::Bytes(_) => base64::decode(&field_text) |
| 346 | + .map(Value::Bytes) |
| 347 | + .map_err(|_| ValueParsingError::InvalidBase64 { base64: field_text }), |
| 348 | + FieldType::JsonObject(_) => Err(ValueParsingError::TypeError { |
| 349 | + expected: "a json object", |
| 350 | + json: JsonValue::String(field_text), |
| 351 | + }), |
| 352 | + FieldType::IpAddr(_) => { |
| 353 | + let ip_addr: IpAddr = IpAddr::from_str(&field_text).map_err(|err| { |
| 354 | + ValueParsingError::ParseError { |
| 355 | + error: err.to_string(), |
| 356 | + json: JsonValue::String(field_text), |
330 | 357 | }
|
331 | 358 | })?;
|
332 |
| - Ok(DateTime::from_utc(dt_with_fixed_tz).into()) |
333 |
| - } |
334 |
| - FieldType::Str(_) => Ok(Value::Str(field_text)), |
335 |
| - FieldType::U64(_) | FieldType::I64(_) | FieldType::F64(_) => { |
336 |
| - Err(ValueParsingError::TypeError { |
337 |
| - expected: "an integer", |
338 |
| - json: JsonValue::String(field_text), |
339 |
| - }) |
| 359 | + let ip_addr_v6: Ipv6Addr = match ip_addr { |
| 360 | + IpAddr::V4(v4) => v4.to_ipv6_mapped(), |
| 361 | + IpAddr::V6(v6) => v6, |
| 362 | + }; |
| 363 | + Ok(Value::IpAddr(ip_addr_v6)) |
| 364 | + } |
340 | 365 | }
|
341 |
| - FieldType::Bool(_) => Err(ValueParsingError::TypeError { |
342 |
| - expected: "a boolean", |
343 |
| - json: JsonValue::String(field_text), |
344 |
| - }), |
345 |
| - FieldType::Facet(_) => Ok(Value::Facet(Facet::from(&field_text))), |
346 |
| - FieldType::Bytes(_) => base64::decode(&field_text) |
347 |
| - .map(Value::Bytes) |
348 |
| - .map_err(|_| ValueParsingError::InvalidBase64 { base64: field_text }), |
349 |
| - FieldType::JsonObject(_) => Err(ValueParsingError::TypeError { |
350 |
| - expected: "a json object", |
351 |
| - json: JsonValue::String(field_text), |
352 |
| - }), |
353 |
| - FieldType::IpAddr(_) => Ok(Value::IpAddr(IpAddr::from_str(&field_text).map_err( |
354 |
| - |err| ValueParsingError::ParseError { |
355 |
| - error: err.to_string(), |
356 |
| - json: JsonValue::String(field_text), |
357 |
| - }, |
358 |
| - )?)), |
359 |
| - }, |
| 366 | + } |
360 | 367 | JsonValue::Number(field_val_num) => match self {
|
361 | 368 | FieldType::I64(_) | FieldType::Date(_) => {
|
362 | 369 | if let Some(field_val_i64) = field_val_num.as_i64() {
|
|
0 commit comments