Skip to content

Commit c0bc7fc

Browse files
lcawll-trottageorgewallace
authored
[8.18] update logic for x-metatags to use the standard term used by webteam (#5029)
Co-authored-by: Laura Trotta <[email protected]> Co-authored-by: George Wallace <[email protected]>
1 parent 635e707 commit c0bc7fc

File tree

8 files changed

+8454
-1218
lines changed

8 files changed

+8454
-1218
lines changed

compiler-rs/clients_schema_to_openapi/src/lib.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use indexmap::IndexMap;
2525

2626
use clients_schema::{Availabilities, Availability, Flavor, IndexedModel, Stability, Visibility};
2727
use openapiv3::{Components, OpenAPI};
28-
use serde_json::Value;
28+
use serde_json::{Map,Value};
2929
use clients_schema::transform::ExpandConfig;
3030
use crate::components::TypesAndComponents;
3131

@@ -56,7 +56,7 @@ pub struct OpenApiConversion {
5656
}
5757

5858
/// Convert an API model into an OpenAPI v3 schema, optionally filtered for a given flavor
59-
pub fn convert_schema(mut schema: IndexedModel, config: Configuration) -> anyhow::Result<OpenApiConversion> {
59+
pub fn convert_schema(mut schema: IndexedModel, config: Configuration, product_meta: IndexMap<String,String>) -> anyhow::Result<OpenApiConversion> {
6060
// Expand generics
6161
schema = clients_schema::transform::expand_generics(schema, ExpandConfig::default())?;
6262

@@ -77,7 +77,7 @@ pub fn convert_schema(mut schema: IndexedModel, config: Configuration) -> anyhow
7777
schema = clients_schema::transform::filter_availability(schema, filter)?;
7878
}
7979

80-
convert_expanded_schema(&schema, &config)
80+
convert_expanded_schema(&schema, &config, &product_meta)
8181
}
8282

8383
/// Convert an API model into an OpenAPI v3 schema. The input model must have all generics expanded, conversion
@@ -86,7 +86,7 @@ pub fn convert_schema(mut schema: IndexedModel, config: Configuration) -> anyhow
8686
/// Note: there are ways to represent [generics in JSON Schema], but its unlikely that tooling will understand it.
8787
///
8888
/// [generics in JSON Schema]: https://json-schema.org/blog/posts/dynamicref-and-generics
89-
pub fn convert_expanded_schema(model: &IndexedModel, config: &Configuration) -> anyhow::Result<OpenApiConversion> {
89+
pub fn convert_expanded_schema(model: &IndexedModel, config: &Configuration, product_meta: &IndexMap<String,String>) -> anyhow::Result<OpenApiConversion> {
9090
let mut openapi = OpenAPI {
9191
openapi: "3.0.3".into(),
9292
info: info(model),
@@ -124,7 +124,7 @@ pub fn convert_expanded_schema(model: &IndexedModel, config: &Configuration) ->
124124
continue;
125125
}
126126
}
127-
paths::add_endpoint(endpoint, &mut tac, &mut openapi.paths)?;
127+
paths::add_endpoint(endpoint, &mut tac, &mut openapi.paths, product_meta)?;
128128
}
129129

130130
// // Sort maps to ensure output stability
@@ -184,7 +184,24 @@ fn info(model: &IndexedModel) -> openapiv3::Info {
184184
}
185185
}
186186

187-
pub fn availability_as_extensions(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>) -> IndexMap<String, serde_json::Value> {
187+
pub fn product_meta_as_extensions(namespace: &str, product_meta: &IndexMap<String,String>) -> IndexMap<String, Value> {
188+
let mut result = IndexMap::new();
189+
let mut additional_namespace= "".to_string();
190+
if let Some(meta) = product_meta.get(namespace) {
191+
additional_namespace = format!(", {meta}");
192+
}
193+
194+
let product_str = format!("Elasticsearch{additional_namespace}");
195+
let mut product_feature_list: Vec<Value> = Vec::new();
196+
let mut product_feature: Map<String, Value> = Map::new();
197+
product_feature.insert("name".to_string(),Value::String("product_name".to_string()));
198+
product_feature.insert("content".to_string(),Value::String(product_str));
199+
product_feature_list.push(Value::Object(product_feature));
200+
result.insert("x-metaTags".to_string(), Value::Array(product_feature_list));
201+
result
202+
}
203+
204+
pub fn availability_as_extensions(availabilities: &Option<Availabilities>, flavor: &Option<Flavor>) -> IndexMap<String, Value> {
188205
let mut result = IndexMap::new();
189206
convert_availabilities(availabilities, flavor, &mut result);
190207
result

compiler-rs/clients_schema_to_openapi/src/main.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
// under the License.
1717

1818
use std::fs::File;
19-
use clients_schema::IndexedModel;
19+
use indexmap::IndexMap;
20+
use clients_schema::{IndexedModel};
2021
use tracing::Level;
2122
use tracing_subscriber::fmt::format::FmtSpan;
2223
use tracing_subscriber::FmtSubscriber;
@@ -32,10 +33,12 @@ fn main() -> anyhow::Result<()> {
3233
.finish();
3334
tracing::subscriber::set_global_default(subscriber)?;
3435

36+
let product_meta: IndexMap<String, String> = serde_json::from_reader(File::open("../../specification/_doc_ids/product-meta.json")?)?;
3537
let schema = IndexedModel::from_reader(File::open(&cli.schema)?)?;
3638
let output = cli.output.clone();
3739
let redirect_path = cli.redirect_path(&cli.output);
38-
let openapi = clients_schema_to_openapi::convert_schema(schema, cli.into())?;
40+
let openapi = clients_schema_to_openapi::convert_schema(schema, cli.into(), product_meta)?;
41+
serde_json::to_writer_pretty(File::create(&output)?, &openapi.openapi)?;
3942
serde_json::to_writer_pretty(File::create(&output)?, &openapi.openapi)?;
4043

4144
if let Some(redirects) = openapi.redirects {

compiler-rs/clients_schema_to_openapi/src/paths.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ use crate::convert_availabilities;
3838
pub fn add_endpoint(
3939
endpoint: &clients_schema::Endpoint,
4040
tac: &mut TypesAndComponents,
41-
out: &mut Paths
41+
out: &mut Paths,
42+
product_meta: &IndexMap<String,String>
4243
) -> anyhow::Result<()> {
4344
if endpoint.request.is_none() {
4445
// tracing::warn!("Endpoint {} is missing a request -- ignored", &endpoint.name);
@@ -373,6 +374,7 @@ pub fn add_endpoint(
373374
extensions.insert("x-codeSamples".to_string(), serde_json::json!(code_samples));
374375
}
375376
}
377+
extensions.append(&mut crate::product_meta_as_extensions(namespace, product_meta));
376378

377379
// Create the operation, it will be repeated if we have several methods
378380
let operation = openapiv3::Operation {
Binary file not shown.

compiler-rs/compiler-wasm-lib/src/lib.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
use std::path::PathBuf;
18+
use std::path::{PathBuf};
1919
use argh::FromArgs;
20-
use clients_schema::IndexedModel;
20+
use clients_schema::{IndexedModel};
2121
use wasm_bindgen::prelude::*;
22+
use clients_schema::indexmap::IndexMap;
2223
use clients_schema_to_openapi::cli::Cli;
2324

2425
/// Minimal bindings to Node's `fs` module.
@@ -63,8 +64,15 @@ pub fn convert0(cli: Cli, cwd: Option<String>) -> anyhow::Result<()> {
6364

6465
let json = node_fs::read_file_sync_to_string(&input.to_string_lossy(), "utf8");
6566
let schema = IndexedModel::from_reader(json.as_bytes())?;
67+
68+
let product_meta_path = match cwd {
69+
Some(ref cwd) => format!("{cwd}/specification/_doc_ids/product-meta.json"),
70+
None => "specification/_doc_ids/product-meta.json".to_string(),
71+
};
72+
let json_product_map = node_fs::read_file_sync_to_string(&product_meta_path, "utf8");
73+
let product_meta: IndexMap<String, String> = serde_json::from_str(&json_product_map).expect("Cannot parse product metadata file");
6674

67-
let openapi = clients_schema_to_openapi::convert_schema(schema, cli.into())?;
75+
let openapi = clients_schema_to_openapi::convert_schema(schema, cli.into(), product_meta)?;
6876

6977
let result = serde_json::to_string_pretty(&openapi.openapi)?;
7078
node_fs::write_file_sync(&output.to_string_lossy(), &result);

0 commit comments

Comments
 (0)