es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Validación de campo requerido condicional en Serde.

¿Puedo especificar que un campo debe estar presente (no nulo) si (y solo si) otro campo tiene un cierto valor?

Aquí hay un ejemplo (ver el comentario):

#[derive(Serialize, Deserialize, Debug)]
pub struct Params {
    pub id: i32,
    pub foo: i32,
    pub bar: Option<i32>, // esto debe ser Some si "foo == 5"
}

También estoy interesado en casos donde foo es un enum.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes especificar que un campo debe estar presente si otro campo tiene un determinado valor utilizando la función de validación incorporada de Serde.

    Por ejemplo, si deseas asegurarte de que el campo bar esté presente solo cuando foo == 5, puedes utilizar el atributo validate de Serde con una función de validación personalizada de esta manera:

    #[derive(Serialize, Deserialize, Debug)]
    pub struct Params {
        pub id: i32,
        pub foo: FooEnum,
        #[serde(skip_serializing_if = "Option::is_none")]
        #[serde(default)]
        #[serde(validate = "validate_bar")]
        pub bar: Option<i32>,
    }
    
    #[derive(Serialize, Deserialize, Debug)]
    pub enum FooEnum {
        #[serde(rename = "5")]
        Foo5,
        #[serde(rename = "10")]
        Foo10,
    }
    
    fn validate_bar(bar: &Option<i32>, params: &Params) -> Result<(), String> {
        match params.foo {
            FooEnum::Foo5 if bar.is_none() => Err(String::from("el campo 'bar' debe estar presente si 'foo == 5'")),
            _ => Ok(()),
        }
    }
    

    En este ejemplo, el campo bar se marca como opcional (Option) y se omite durante la serialización si no está presente. El atributo default establece el valor predeterminado de bar en None durante la deserialización si no está presente en la entrada.

    El atributo validate se utiliza para especificar la función de validación personalizada validate_bar que toma una referencia al campo bar y una referencia a la estructura Params completa. La función de validación verifica el campo foo y devuelve un mensaje de error si el campo bar está ausente y foo == 5. De lo contrario, devuelve Ok(()), lo que indica que el campo es válido.

    Ten en cuenta que el campo FooEnum se utiliza para definir los posibles valores de foo como un tipo de enumeración. El atributo rename se utiliza para especificar el valor de cadena que corresponde a cada variante de la enumeración.

    Puedes ampliar la función de validación para manejar condiciones más complejas si es necesario. Lo principal es que Serde te permite definir funciones de validación personalizadas que pueden validar tus estructuras de datos según las reglas específicas de tu aplicación.

Comments are closed.