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.
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 cuandofoo == 5
, puedes utilizar el atributovalidate
de Serde con una función de validación personalizada de esta manera:En este ejemplo, el campo
bar
se marca como opcional (Option
) y se omite durante la serialización si no está presente. El atributodefault
establece el valor predeterminado debar
enNone
durante la deserialización si no está presente en la entrada.El atributo
validate
se utiliza para especificar la función de validación personalizadavalidate_bar
que toma una referencia al campobar
y una referencia a la estructuraParams
completa. La función de validación verifica el campofoo
y devuelve un mensaje de error si el campobar
está ausente yfoo == 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 defoo
como un tipo de enumeración. El atributorename
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.