mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-11-04 09:56:28 +00:00 
			
		
		
		
	Check the validity of the latitute and longitude numbers
This commit is contained in:
		@@ -326,11 +326,23 @@ pub fn validate_document_id_value(document_id: Value) -> Result<StdResult<String
 | 
			
		||||
 | 
			
		||||
/// Try to extract an `f64` from a JSON `Value` and return the `Value`
 | 
			
		||||
/// in the `Err` variant if it failed.
 | 
			
		||||
pub fn extract_float_from_value(value: Value) -> StdResult<f64, Value> {
 | 
			
		||||
    match value {
 | 
			
		||||
        Value::Number(ref n) => n.as_f64().ok_or(value),
 | 
			
		||||
        Value::String(ref s) => s.parse::<f64>().map_err(|_| value),
 | 
			
		||||
        value => Err(value),
 | 
			
		||||
pub fn extract_finite_float_from_value(value: Value) -> StdResult<f64, Value> {
 | 
			
		||||
    let number = match value {
 | 
			
		||||
        Value::Number(ref n) => match n.as_f64() {
 | 
			
		||||
            Some(number) => number,
 | 
			
		||||
            None => return Err(value),
 | 
			
		||||
        },
 | 
			
		||||
        Value::String(ref s) => match s.parse::<f64>() {
 | 
			
		||||
            Ok(number) => number,
 | 
			
		||||
            Err(_) => return Err(value),
 | 
			
		||||
        },
 | 
			
		||||
        value => return Err(value),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if number.is_finite() {
 | 
			
		||||
        Ok(number)
 | 
			
		||||
    } else {
 | 
			
		||||
        Err(value)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -340,7 +352,7 @@ pub fn validate_geo_from_json(id: &DocumentId, bytes: &[u8]) -> Result<StdResult
 | 
			
		||||
    match serde_json::from_slice(bytes).map_err(InternalError::SerdeJson)? {
 | 
			
		||||
        Value::Object(mut object) => match (object.remove("lat"), object.remove("lng")) {
 | 
			
		||||
            (Some(lat), Some(lng)) => {
 | 
			
		||||
                match (extract_float_from_value(lat), extract_float_from_value(lng)) {
 | 
			
		||||
                match (extract_finite_float_from_value(lat), extract_finite_float_from_value(lng)) {
 | 
			
		||||
                    (Ok(_), Ok(_)) => Ok(Ok(())),
 | 
			
		||||
                    (Err(value), Ok(_)) => Ok(Err(BadLatitude { document_id: debug_id(), value })),
 | 
			
		||||
                    (Ok(_), Err(value)) => Ok(Err(BadLongitude { document_id: debug_id(), value })),
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ use serde_json::Value;
 | 
			
		||||
 | 
			
		||||
use super::helpers::{create_writer, writer_into_reader, GrenadParameters};
 | 
			
		||||
use crate::error::GeoError;
 | 
			
		||||
use crate::update::index_documents::extract_float_from_value;
 | 
			
		||||
use crate::update::index_documents::extract_finite_float_from_value;
 | 
			
		||||
use crate::{FieldId, InternalError, Result};
 | 
			
		||||
 | 
			
		||||
/// Extracts the geographical coordinates contained in each document under the `_geo` field.
 | 
			
		||||
@@ -40,12 +40,12 @@ pub fn extract_geo_points<R: io::Read + io::Seek>(
 | 
			
		||||
 | 
			
		||||
        if let Some((lat, lng)) = lat.zip(lng) {
 | 
			
		||||
            // then we extract the values
 | 
			
		||||
            let lat = extract_float_from_value(
 | 
			
		||||
            let lat = extract_finite_float_from_value(
 | 
			
		||||
                serde_json::from_slice(lat).map_err(InternalError::SerdeJson)?,
 | 
			
		||||
            )
 | 
			
		||||
            .map_err(|lat| GeoError::BadLatitude { document_id: document_id(), value: lat })?;
 | 
			
		||||
 | 
			
		||||
            let lng = extract_float_from_value(
 | 
			
		||||
            let lng = extract_finite_float_from_value(
 | 
			
		||||
                serde_json::from_slice(lng).map_err(InternalError::SerdeJson)?,
 | 
			
		||||
            )
 | 
			
		||||
            .map_err(|lng| GeoError::BadLongitude { document_id: document_id(), value: lng })?;
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ use typed_chunk::{write_typed_chunk_into_index, TypedChunk};
 | 
			
		||||
 | 
			
		||||
use self::enrich::enrich_documents_batch;
 | 
			
		||||
pub use self::enrich::{
 | 
			
		||||
    extract_float_from_value, validate_document_id, validate_document_id_value,
 | 
			
		||||
    extract_finite_float_from_value, validate_document_id, validate_document_id_value,
 | 
			
		||||
    validate_geo_from_json, DocumentId,
 | 
			
		||||
};
 | 
			
		||||
pub use self::helpers::{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user