Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Client type constructors sometimes ignore bounds in OpenAPI spec

Abierto
#986 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
45/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
rust
Área
compilers

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

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de oxidecomputer/typify

Todos los issues de oxidecomputer/typify

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.