Skip to content

Reducing common structs types or https://github.com/kube-rs/gateway-api-rs/issues/38 #147

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
443 changes: 377 additions & 66 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["gateway-api", "gateway-api/examples", "xtask"]
members = ["gateway-api", "gateway-api/examples", "xtask", "type-reducer"]
resolver = "2"

[workspace.package]
Expand Down
16 changes: 16 additions & 0 deletions gateway-api/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Changelog

## Next

>[!IMPORTANT]
Breaking change

### Changed
The structure of APIs has changed to promote the re-use of types in the generated code. The APIs are still generated with Kopium in the first step, but there is a second stage where additional task is executed to reduce and rename the Kopium-generated types.
While with this approach we can significantly reduce the surface of exposed APIs, it is also a breaking change.
See [issue](https://github.com/kube-rs/gateway-api-rs/issues/38) for more context.

## 0.16.0

### Changed
Initial release. All types are generated with Kopium.
10 changes: 9 additions & 1 deletion gateway-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,13 @@ uuid.workspace = true
features = ["k8s-openapi/v1_32"]

[features]
default = []
default = ["standard", "experimental"]
standard = []
experimental = []


[lints.clippy]
derivable_impls = "allow"
doc_lazy_continuation = "allow"
tabs_in_doc_comments = "allow"
empty_line_after_doc_comments = "allow"
351 changes: 351 additions & 0 deletions gateway-api/src/apis/experimental/common.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,351 @@
// WARNING: generated file - manual changes will be overriden

#[allow(unused_imports)]
mod prelude {
pub use k8s_openapi::apimachinery::pkg::apis::meta::v1::Condition;
pub use kube::CustomResource;
pub use schemars::JsonSchema;
pub use serde::{Deserialize, Serialize};
pub use std::collections::BTreeMap;
}
use self::prelude::*;
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum GRPCFilterType {
ResponseHeaderModifier,
RequestHeaderModifier,
RequestMirror,
ExtensionRef,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum HTTPFilterType {
RequestHeaderModifier,
ResponseHeaderModifier,
RequestMirror,
RequestRedirect,
#[serde(rename = "URLRewrite")]
UrlRewrite,
ExtensionRef,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum HeaderMatchType {
Exact,
RegularExpression,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum PersistenceCookieConfigLifetime {
Permanent,
Session,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum RedirectStatusCode {
#[serde(rename = "301")]
r#_301,
#[serde(rename = "302")]
r#_302,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum RequestOperationType {
ReplaceFullPath,
ReplacePrefixMatch,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum RequestRedirectScheme {
#[serde(rename = "http")]
Http,
#[serde(rename = "https")]
Https,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, PartialEq)]
pub enum SessionPersistenceType {
Cookie,
Header,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct BackendReference {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub port: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub weight: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct BackendTlsClientCertificateReference {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct GatewayAddress {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
pub r#type: Option<String>,
pub value: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct GatewayInfrastructureParametersReference {
pub group: String,
pub kind: String,
pub name: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct HTTPHeader {
pub name: String,
pub value: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct Kind {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
pub kind: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct ParametersReference {
pub group: String,
pub kind: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct ParentReference {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub port: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "sectionName"
)]
pub section_name: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct RequestMirrorFraction {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub denominator: Option<i32>,
pub numerator: i32,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct RequestMirrorReference {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub port: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct CommonRouteRule {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "backendRefs"
)]
pub backend_refs: Option<Vec<BackendReference>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct HeaderMatch {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
pub r#type: Option<HeaderMatchType>,
pub value: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct HeaderModifier {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub add: Option<Vec<HTTPHeader>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub remove: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub set: Option<Vec<HTTPHeader>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct ParentRouteStatus {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conditions: Option<Vec<Condition>>,
#[serde(rename = "controllerName")]
pub controller_name: String,
#[serde(rename = "parentRef")]
pub parent_ref: ParentReference,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct RequestMirror {
#[serde(rename = "backendRef")]
pub backend_ref: RequestMirrorReference,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fraction: Option<RequestMirrorFraction>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub percent: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct RequestRedirectPath {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "replaceFullPath"
)]
pub replace_full_path: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "replacePrefixMatch"
)]
pub replace_prefix_match: Option<String>,
#[serde(rename = "type")]
pub r#type: RequestOperationType,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct SessionPersistenceCookieConfig {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "lifetimeType"
)]
pub lifetime_type: Option<PersistenceCookieConfigLifetime>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct GRPCRouteFilter {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "extensionRef"
)]
pub extension_ref: Option<GatewayInfrastructureParametersReference>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestHeaderModifier"
)]
pub request_header_modifier: Option<HeaderModifier>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestMirror"
)]
pub request_mirror: Option<RequestMirror>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "responseHeaderModifier"
)]
pub response_header_modifier: Option<HeaderModifier>,
#[serde(rename = "type")]
pub r#type: GRPCFilterType,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct RequestRedirect {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hostname: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<RequestRedirectPath>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub port: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scheme: Option<RequestRedirectScheme>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "statusCode"
)]
pub status_code: Option<i64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct HTTPRouteUrlRewrite {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hostname: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<RequestRedirectPath>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct RouteStatus {
pub parents: Vec<ParentRouteStatus>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct SessionPersistence {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "absoluteTimeout"
)]
pub absolute_timeout: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "cookieConfig"
)]
pub cookie_config: Option<SessionPersistenceCookieConfig>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "idleTimeout"
)]
pub idle_timeout: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "sessionName"
)]
pub session_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
pub r#type: Option<SessionPersistenceType>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
pub struct HTTPRouteBackendFilters {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "extensionRef"
)]
pub extension_ref: Option<GatewayInfrastructureParametersReference>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestHeaderModifier"
)]
pub request_header_modifier: Option<HeaderModifier>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestMirror"
)]
pub request_mirror: Option<RequestMirror>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestRedirect"
)]
pub request_redirect: Option<RequestRedirect>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "responseHeaderModifier"
)]
pub response_header_modifier: Option<HeaderModifier>,
#[serde(rename = "type")]
pub r#type: HTTPFilterType,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "urlRewrite"
)]
pub url_rewrite: Option<HTTPRouteUrlRewrite>,
}
Loading
Loading