Client type constructors sometimes ignore bounds in OpenAPI spec
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
Línea de trabajo
Empieza rastreando cómo se genera el tipo de cliente generado a partir de los límites de OpenAPI y dónde se selecciona su constructor infalible From<u8>. Compara el comportamiento del constructor generado con los valores mínimo y máximo del esquema Dscp; se considera terminado cuando ya no se pueden crear valores no válidos mediante un constructor infalible y se respetan los límites.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I have a custom Rust type on the server side that wraps a u8 and limits its valid values to just 0-63. With a custom JsonSchema impl, these upper/lower bounds are encoded into the OpenAPI spec:
/// DSCP value for BGP TCP connections (0-63).
///
/// RFC 4271 Appendix E recommends CS6 (48) for BGP traffic.
/// Default: CS6 (48).
634: #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
635: #[serde(try_from = "u8", into = "u8")]
636: pub struct Dscp(u8);
impl Dscp {
/// CS6 (48) — the RFC 4271 Appendix E recommended default.
pub const CS6: Self = Self(48);
/// Create a new DSCP value, returning an error if out of range.
pub fn new(val: u8) -> Result<Self, String> {
if val > 63 {
Err(format!("DSCP value {val} out of range (0-63)"))
} else {
Ok(Self(val))
}
}
/// Return the raw numeric value.
pub fn value(self) -> u8 {
self.0
}
}
impl Default for Dscp {
fn default() -> Self {
Self::CS6
}
}
impl TryFrom<u8> for Dscp {
type Error = String;
fn try_from(val: u8) -> Result<Self, Self::Error> {
Self::new(val)
}
}
impl From<Dscp> for u8 {
fn from(d: Dscp) -> u8 {
d.0
}
}
impl JsonSchema for Dscp {
fn schema_name() -> String {
"Dscp".to_string()
}
fn json_schema(
_g: &mut schemars::r#gen::SchemaGenerator,
) -> schemars::schema::Schema {
schemars::schema::SchemaObject {
instance_type: Some(schemars::schema::InstanceType::Integer.into()),
format: Some("uint8".to_string()),
number: Some(Box::new(schemars::schema::NumberValidation {
minimum: Some(0.0),
maximum: Some(63.0),
..Default::default()
})),
metadata: Some(Box::new(schemars::schema::Metadata {
description: Some(
"DSCP value (0-63). Default: CS6 (48).".to_string(),
),
..Default::default()
})),
..Default::default()
}
.into()
}
}
OpenAPI snippet:
"Dscp": {
"description": "DSCP value (0-63). Default: CS6 (48).",
"type": "integer",
"format": "uint8",
"minimum": 0,
"maximum": 63
},
However, the generated client type has an infallible constructor (impl From<u8> for Dscp) which allows the client to construct invalid values where the type invariants are not upheld.
- Lenguaje dominante
- Rust
- Estrellas
- 898
- Forks
- 114
- Merge medio
- 4 h 18 min
- PR fusionados (30 d)
- 14
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de oxidecomputer/typify
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
oxidecomputer/typify#1077 · 1 comentario ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
oxidecomputer/typify#1075 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 50/100
oxidecomputer/typify#1060 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 48/100
oxidecomputer/typify#1059 ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 65/100
oxidecomputer/typify#1022 · 1 comentario ·
Todos los issues de oxidecomputer/typify
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
-
bug core
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
-
JIT-compiled number -> Decimal conversion silently overflows instead of raising DECIMAL_OVERFLOW Abiertofuzz
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
ClickHouse/ClickHouse#122114 ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
linebender/vello_svg#90 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100