From 0208e22aca0733a873b214dc5c1b42a11fff7c7b Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 13 Nov 2024 09:15:26 -0500 Subject: [PATCH] test(googletest/rust): generate the type golden crate --- Cargo.lock | 14 ++++ Cargo.toml | 1 + generator/cmd/main_test.go | 67 ++++++++++++------- .../rust/gclient/golden/type/Cargo.toml | 14 ++++ .../rust/gclient/golden/type/README.md | 3 + .../rust/gclient/golden/type/src/lib.rs | 29 ++++++++ .../rust/gclient/golden/type/src/model.rs | 54 +++++++++++++++ 7 files changed, 157 insertions(+), 25 deletions(-) create mode 100755 generator/testdata/rust/gclient/golden/type/Cargo.toml create mode 100755 generator/testdata/rust/gclient/golden/type/README.md create mode 100755 generator/testdata/rust/gclient/golden/type/src/lib.rs create mode 100755 generator/testdata/rust/gclient/golden/type/src/model.rs diff --git a/Cargo.lock b/Cargo.lock index a9d5d67d9..509e8154f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1734,6 +1734,20 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "type-golden-gclient" +version = "0.1.0" +dependencies = [ + "bytes", + "gax", + "reqwest 0.12.9", + "serde", + "serde_json", + "serde_with", + "time", + "types", +] + [[package]] name = "types" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index a69392b3b..0d274cdd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,5 +21,6 @@ members = [ "types", "gax", "generator/testdata/rust/openapi/golden", + "generator/testdata/rust/gclient/golden/type", "generator/testdata/rust/gclient/golden/secretmanager", ] diff --git a/generator/cmd/main_test.go b/generator/cmd/main_test.go index 5a1b80820..2eccb4823 100644 --- a/generator/cmd/main_test.go +++ b/generator/cmd/main_test.go @@ -70,38 +70,55 @@ func TestRustFromOpenAPI(t *testing.T) { func TestRustFromProtobuf(t *testing.T) { const ( projectRoot = ".." - outDir = "testdata/rust/gclient/golden/secretmanager" + outDir = "testdata/rust/gclient/golden" ) - popts := &genclient.ParserOptions{ - Source: "../testdata/rust/gclient/protos", - Options: map[string]string{ - "googleapis-root": "../testdata/googleapis", - "input-root": "../testdata", - }, + type Config struct { + Source string + Name string } - copts := &genclient.CodecOptions{ - Language: "rust", - ProjectRoot: projectRoot, - OutDir: outDir, - TemplateDir: "../templates", - Options: map[string]string{ - "package-name-override": "secretmanager-golden-gclient", - "package:gax_placeholder": "package=types,path=../../../../../../types,source=google.protobuf", - "package:gax": "package=gax,path=../../../../../../gax", + configs := []Config{ + { + Source: "../testdata/rust/gclient/protos", + Name: "secretmanager", + }, + { + Source: "../testdata/googleapis/google/type", + Name: "type", }, - } - err := Generate("protobuf", popts, copts) - if err != nil { - t.Fatal(err) } - cmd := exec.Command("cargo", "fmt", "--manifest-path", path.Join(projectRoot, outDir, "Cargo.toml")) - if output, err := cmd.CombinedOutput(); err != nil { - if ee := (*exec.ExitError)(nil); errors.As(err, &ee) && len(ee.Stderr) > 0 { - t.Fatalf("%v: %v\n%s", cmd, err, ee.Stderr) + for _, config := range configs { + popts := &genclient.ParserOptions{ + Source: config.Source, + Options: map[string]string{ + "googleapis-root": "../testdata/googleapis", + "input-root": "../testdata", + }, + } + copts := &genclient.CodecOptions{ + Language: "rust", + ProjectRoot: projectRoot, + OutDir: path.Join(outDir, config.Name), + TemplateDir: "../templates", + Options: map[string]string{ + "package-name-override": config.Name + "-golden-gclient", + "package:gax_placeholder": "package=types,path=../../../../../../types,source=google.protobuf", + "package:gax": "package=gax,path=../../../../../../gax", + }, + } + err := Generate("protobuf", popts, copts) + if err != nil { + t.Fatal(err) + } + + cmd := exec.Command("cargo", "fmt", "--manifest-path", path.Join(projectRoot, outDir, config.Name, "Cargo.toml")) + if output, err := cmd.CombinedOutput(); err != nil { + if ee := (*exec.ExitError)(nil); errors.As(err, &ee) && len(ee.Stderr) > 0 { + t.Fatalf("%v: %v\n%s", cmd, err, ee.Stderr) + } + t.Fatalf("%v: %v\n%s", cmd, err, output) } - t.Fatalf("%v: %v\n%s", cmd, err, output) } } diff --git a/generator/testdata/rust/gclient/golden/type/Cargo.toml b/generator/testdata/rust/gclient/golden/type/Cargo.toml new file mode 100755 index 000000000..72c621670 --- /dev/null +++ b/generator/testdata/rust/gclient/golden/type/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "type-golden-gclient" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { version = "1.0.214", features = ["serde_derive"] } +serde_with = "3.11.0" +serde_json = "1.0.132" +time = { version = "0.3.36", features = ["formatting", "parsing"] } +reqwest = { version = "0.12.9", features = ["json"] } +bytes = { version = "1.8.0", features = ["serde"] } +gax = { path = "../../../../../../gax", package = "gax" } +gax_placeholder = { path = "../../../../../../types", package = "types" } diff --git a/generator/testdata/rust/gclient/golden/type/README.md b/generator/testdata/rust/gclient/golden/type/README.md new file mode 100755 index 000000000..4eea15819 --- /dev/null +++ b/generator/testdata/rust/gclient/golden/type/README.md @@ -0,0 +1,3 @@ +# - Rust Client Library + + diff --git a/generator/testdata/rust/gclient/golden/type/src/lib.rs b/generator/testdata/rust/gclient/golden/type/src/lib.rs new file mode 100755 index 000000000..6af53a7a4 --- /dev/null +++ b/generator/testdata/rust/gclient/golden/type/src/lib.rs @@ -0,0 +1,29 @@ +#![allow(dead_code)] + +use std::sync::Arc; + +pub mod model; + +#[derive(Clone, Debug)] +pub struct Client { + inner: Arc, +} + +#[derive(Debug)] +struct ClientRef { + http_client: reqwest::Client, + token: String, +} + +impl Client { + pub fn new(tok: String) -> Self { + let client = reqwest::Client::builder().build().unwrap(); + let inner = ClientRef { + http_client: client, + token: tok, + }; + Self { + inner: Arc::new(inner), + } + } +} diff --git a/generator/testdata/rust/gclient/golden/type/src/model.rs b/generator/testdata/rust/gclient/golden/type/src/model.rs new file mode 100755 index 000000000..7982dd195 --- /dev/null +++ b/generator/testdata/rust/gclient/golden/type/src/model.rs @@ -0,0 +1,54 @@ +#![allow(dead_code)] + +/// Represents a textual expression in the Common Expression Language (CEL) +/// syntax. CEL is a C-like expression language. The syntax and semantics of CEL +/// are documented at https://github.com/google/cel-spec. +/// +/// Example (Comparison): +/// +/// title: "Summary size limit" +/// description: "Determines if a summary is less than 100 chars" +/// expression: "document.summary.size() < 100" +/// +/// Example (Equality): +/// +/// title: "Requestor is owner" +/// description: "Determines if requestor is the document owner" +/// expression: "document.owner == request.auth.claims.email" +/// +/// Example (Logic): +/// +/// title: "Public documents" +/// description: "Determine whether the document should be publicly visible" +/// expression: "document.type != 'private' && document.type != 'internal'" +/// +/// Example (Data Manipulation): +/// +/// title: "Notification string" +/// description: "Create a notification string with a timestamp." +/// expression: "'New message received at ' + string(document.create_time)" +/// +/// The exact variables and functions that may be referenced within an expression +/// are determined by the service that evaluates it. See the service +/// documentation for additional information. +#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +#[non_exhaustive] +pub struct Expr { + /// Textual representation of an expression in Common Expression Language + /// syntax. + pub expression: String, + + /// Optional. Title for the expression, i.e. a short string describing + /// its purpose. This can be used e.g. in UIs which allow to enter the + /// expression. + pub title: String, + + /// Optional. Description of the expression. This is a longer text which + /// describes the expression, e.g. when hovered over it in a UI. + pub description: String, + + /// Optional. String indicating the location of the expression for error + /// reporting, e.g. a file name and a position in the file. + pub location: String, +}