rebuild all APIS

This commit is contained in:
Sebastian Thiel
2023-03-16 18:16:47 +01:00
parent 952ec161b8
commit a791dde0ce
3202 changed files with 103346 additions and 529276 deletions

View File

@@ -1,748 +0,0 @@
// COPY OF 'src/rust/cli/client.rs'
// DO NOT EDIT
use clap::{App, SubCommand};
use mime::Mime;
use crate::oauth2::{ApplicationSecret, ConsoleApplicationSecret};
use serde_json as json;
use serde_json::value::Value;
use std::env;
use std::error::Error as StdError;
use std::fmt;
use std::fs;
use std::io;
use std::io::{stdout, Read, Write};
use std::path::{Path, PathBuf};
use std::str::FromStr;
use std::string::ToString;
use std::default::Default;
const FIELD_SEP: char = '.';
pub enum ComplexType {
Pod,
Vec,
Map,
}
// Null,
// Bool(bool),
// I64(i64),
// U64(u64),
// F64(f64),
// String(String),
pub enum JsonType {
Boolean,
Int,
Uint,
Float,
String,
}
pub struct JsonTypeInfo {
pub jtype: JsonType,
pub ctype: ComplexType,
}
// Based on @erickt user comment. Thanks for the idea !
// Remove all keys whose values are null from given value (changed in place)
pub fn remove_json_null_values(value: &mut Value) {
match *value {
Value::Object(ref mut map) => {
let mut for_removal = Vec::new();
for (key, mut value) in map.iter_mut() {
if value.is_null() {
for_removal.push(key.clone());
} else {
remove_json_null_values(&mut value);
}
}
for key in &for_removal {
map.remove(key);
}
}
json::value::Value::Array(ref mut arr) => {
let mut i = 0;
while i < arr.len() {
if arr[i].is_null() {
arr.remove(i);
} else {
remove_json_null_values(&mut arr[i]);
i += 1;
}
}
}
_ => {}
}
}
fn did_you_mean<'a>(v: &str, possible_values: &[&'a str]) -> Option<&'a str> {
let mut candidate: Option<(f64, &str)> = None;
for pv in possible_values {
let confidence = strsim::jaro_winkler(v, pv);
if confidence > 0.8 && (candidate.is_none() || (candidate.as_ref().unwrap().0 < confidence))
{
candidate = Some((confidence, pv));
}
}
match candidate {
None => None,
Some((_, candidate)) => Some(candidate),
}
}
pub enum CallType {
Upload(UploadProtocol),
Standard,
}
arg_enum! {
pub enum UploadProtocol {
Simple,
// Resumable // This seems to be lost during the async conversion
}
}
impl AsRef<str> for UploadProtocol {
fn as_ref(&self) -> &str {
match *self {
UploadProtocol::Simple => "simple",
// UploadProtocol::Resumable => "resumable",
}
}
}
impl AsRef<str> for CallType {
fn as_ref(&self) -> &str {
match *self {
CallType::Upload(ref proto) => proto.as_ref(),
CallType::Standard => "standard-request",
}
}
}
#[derive(Clone, Default)]
pub struct FieldCursor(Vec<String>);
impl ToString for FieldCursor {
fn to_string(&self) -> String {
self.0.join(".")
}
}
impl From<&'static str> for FieldCursor {
fn from(value: &'static str) -> FieldCursor {
let mut res = FieldCursor::default();
res.set(value).unwrap();
res
}
}
fn assure_entry<'a>(m: &'a mut json::Map<String, Value>, k: &str) -> &'a mut Value {
if m.contains_key(k) {
return m.get_mut(k).expect("value to exist");
}
m.insert(k.to_owned(), Value::Object(Default::default()));
m.get_mut(k).expect("value to exist")
}
impl FieldCursor {
pub fn set(&mut self, value: &str) -> Result<(), CLIError> {
if value.is_empty() {
return Err(CLIError::Field(FieldError::Empty));
}
let mut first_is_field_sep = false;
let mut char_count: usize = 0;
let mut last_c = FIELD_SEP;
let mut num_conscutive_field_seps = 0;
let mut field = String::new();
let mut fields = self.0.clone();
let push_field = |fs: &mut Vec<String>, f: &mut String| {
if !f.is_empty() {
fs.push(f.clone());
f.truncate(0);
}
};
for (cid, c) in value.chars().enumerate() {
char_count += 1;
if c == FIELD_SEP {
if cid == 0 {
first_is_field_sep = true;
}
num_conscutive_field_seps += 1;
if cid > 0 && last_c == FIELD_SEP {
if fields.pop().is_none() {
return Err(CLIError::Field(FieldError::PopOnEmpty(value.to_string())));
}
} else {
push_field(&mut fields, &mut field);
}
} else {
num_conscutive_field_seps = 0;
if cid == 1 && first_is_field_sep {
fields.truncate(0);
}
field.push(c);
}
last_c = c;
}
push_field(&mut fields, &mut field);
if char_count == 1 && first_is_field_sep {
fields.truncate(0);
}
if char_count > 1 && num_conscutive_field_seps == 1 {
return Err(CLIError::Field(FieldError::TrailingFieldSep(
value.to_string(),
)));
}
self.0 = fields;
Ok(())
}
pub fn did_you_mean(value: &str, possible_values: &[&str]) -> Option<String> {
if value.is_empty() {
return None;
}
let mut last_c = FIELD_SEP;
let mut field = String::new();
let mut output = String::new();
let push_field = |fs: &mut String, f: &mut String| {
if !f.is_empty() {
fs.push_str(match did_you_mean(&f, possible_values) {
Some(candidate) => candidate,
None => &f,
});
f.truncate(0);
}
};
for (cid, c) in value.chars().enumerate() {
if c == FIELD_SEP {
if last_c != FIELD_SEP {
push_field(&mut output, &mut field);
}
output.push(c);
} else {
field.push(c);
}
last_c = c;
}
push_field(&mut output, &mut field);
if output == value {
None
} else {
Some(output)
}
}
pub fn set_json_value(
&self,
mut object: &mut Value,
value: &str,
type_info: JsonTypeInfo,
err: &mut InvalidOptionsError,
orig_cursor: &FieldCursor,
) {
assert!(!self.0.is_empty());
for field in &self.0[..self.0.len() - 1] {
let tmp = object;
object = match *tmp {
Value::Object(ref mut mapping) => assure_entry(mapping, &field),
_ => panic!("We don't expect non-object Values here ..."),
};
}
match *object {
Value::Object(ref mut mapping) => {
let field = &self.0[self.0.len() - 1];
let to_jval =
|value: &str, jtype: JsonType, err: &mut InvalidOptionsError| -> Value {
match jtype {
JsonType::Boolean => {
Value::Bool(arg_from_str(value, err, &field, "boolean"))
}
JsonType::Int => Value::Number(
json::Number::from_f64(arg_from_str(value, err, &field, "int"))
.expect("valid f64"),
),
JsonType::Uint => Value::Number(
json::Number::from_f64(arg_from_str(value, err, &field, "uint"))
.expect("valid f64"),
),
JsonType::Float => Value::Number(
json::Number::from_f64(arg_from_str(value, err, &field, "float"))
.expect("valid f64"),
),
JsonType::String => Value::String(value.to_owned()),
}
};
match type_info.ctype {
ComplexType::Pod => {
if mapping
.insert(field.to_owned(), to_jval(value, type_info.jtype, err))
.is_some()
{
err.issues.push(CLIError::Field(FieldError::Duplicate(
orig_cursor.to_string(),
)));
}
}
ComplexType::Vec => match *assure_entry(mapping, field) {
Value::Array(ref mut values) => {
values.push(to_jval(value, type_info.jtype, err))
}
_ => unreachable!(),
},
ComplexType::Map => {
let (key, value) = parse_kv_arg(value, err, true);
let jval = to_jval(value.unwrap_or(""), type_info.jtype, err);
match *assure_entry(mapping, &field) {
Value::Object(ref mut value_map) => {
if value_map.insert(key.to_owned(), jval).is_some() {
err.issues.push(CLIError::Field(FieldError::Duplicate(
orig_cursor.to_string(),
)));
}
}
_ => unreachable!(),
}
}
}
}
_ => unreachable!(),
}
}
pub fn num_fields(&self) -> usize {
self.0.len()
}
}
pub fn parse_kv_arg<'a>(
kv: &'a str,
err: &mut InvalidOptionsError,
for_hashmap: bool,
) -> (&'a str, Option<&'a str>) {
let mut add_err = || {
err.issues
.push(CLIError::InvalidKeyValueSyntax(kv.to_string(), for_hashmap))
};
match kv.find('=') {
None => {
add_err();
(kv, None)
}
Some(pos) => {
let key = &kv[..pos];
if kv.len() <= pos + 1 {
add_err();
return (key, Some(""));
}
(key, Some(&kv[pos + 1..]))
}
}
}
pub fn calltype_from_str(
name: &str,
valid_protocols: Vec<String>,
err: &mut InvalidOptionsError,
) -> CallType {
CallType::Upload(match UploadProtocol::from_str(name) {
Ok(up) => up,
Err(msg) => {
err.issues.push(CLIError::InvalidUploadProtocol(
name.to_string(),
valid_protocols,
));
UploadProtocol::Simple
}
})
}
pub fn input_file_from_opts(file_path: &str, err: &mut InvalidOptionsError) -> Option<fs::File> {
match fs::File::open(file_path) {
Ok(f) => Some(f),
Err(io_err) => {
err.issues.push(CLIError::Input(InputError::Io((
file_path.to_string(),
io_err,
))));
None
}
}
}
pub fn input_mime_from_opts(mime: &str, err: &mut InvalidOptionsError) -> Option<Mime> {
match mime.parse() {
Ok(m) => Some(m),
Err(_) => {
err.issues
.push(CLIError::Input(InputError::Mime(mime.to_string())));
None
}
}
}
pub fn writer_from_opts(arg: Option<&str>) -> Result<Box<dyn Write>, io::Error> {
let f = arg.unwrap_or("-");
match f {
"-" => Ok(Box::new(stdout())),
_ => match fs::OpenOptions::new()
.create(true)
.truncate(true)
.write(true)
.open(f)
{
Ok(f) => Ok(Box::new(f)),
Err(io_err) => Err(io_err),
},
}
}
pub fn arg_from_str<'a, T>(
arg: &str,
err: &mut InvalidOptionsError,
arg_name: &'a str,
arg_type: &'a str,
) -> T
where
T: FromStr + Default,
<T as FromStr>::Err: fmt::Display,
{
match FromStr::from_str(arg) {
Err(perr) => {
err.issues.push(CLIError::ParseError(
arg_name.to_owned(),
arg_type.to_owned(),
arg.to_string(),
format!("{}", perr),
));
Default::default()
}
Ok(v) => v,
}
}
#[derive(Debug)]
pub enum ApplicationSecretError {
DecoderError((String, json::Error)),
FormatError(String),
}
impl fmt::Display for ApplicationSecretError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match *self {
ApplicationSecretError::DecoderError((ref path, ref err)) => writeln!(
f,
"Could not decode file at '{}' with error: {}.",
path, err
),
ApplicationSecretError::FormatError(ref path) => writeln!(
f,
"'installed' field is unset in secret file at '{}'.",
path
),
}
}
}
#[derive(Debug)]
pub enum ConfigurationError {
DirectoryCreationFailed((String, io::Error)),
DirectoryUnset,
HomeExpansionFailed(String),
Secret(ApplicationSecretError),
Io((String, io::Error)),
}
impl fmt::Display for ConfigurationError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match *self {
ConfigurationError::DirectoryCreationFailed((ref dir, ref err)) => writeln!(
f,
"Directory '{}' could not be created with error: {}.",
dir, err
),
ConfigurationError::DirectoryUnset => writeln!(f, "--config-dir was unset or empty."),
ConfigurationError::HomeExpansionFailed(ref dir) => writeln!(
f,
"Couldn't find HOME directory of current user, failed to expand '{}'.",
dir
),
ConfigurationError::Secret(ref err) => writeln!(f, "Secret -> {}", err),
ConfigurationError::Io((ref path, ref err)) => writeln!(
f,
"IO operation failed on path '{}' with error: {}.",
path, err
),
}
}
}
#[derive(Debug)]
pub enum InputError {
Io((String, io::Error)),
Mime(String),
}
impl fmt::Display for InputError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match *self {
InputError::Io((ref file_path, ref io_err)) => writeln!(
f,
"Failed to open '{}' for reading with error: {}.",
file_path, io_err
),
InputError::Mime(ref mime) => writeln!(f, "'{}' is not a known mime-type.", mime),
}
}
}
#[derive(Debug)]
pub enum FieldError {
PopOnEmpty(String),
TrailingFieldSep(String),
Unknown(String, Option<String>, Option<String>),
Duplicate(String),
Empty,
}
impl fmt::Display for FieldError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match *self {
FieldError::PopOnEmpty(ref field) => {
writeln!(f, "'{}': Cannot move up on empty field cursor.", field)
}
FieldError::TrailingFieldSep(ref field) => writeln!(
f,
"'{}': Single field separator may not be last character.",
field
),
FieldError::Unknown(ref field, ref suggestion, ref value) => {
let suffix = match *suggestion {
Some(ref s) => {
let kv = match *value {
Some(ref v) => format!("{}={}", s, v),
None => s.clone(),
};
format!(" Did you mean '{}' ?", kv)
}
None => String::new(),
};
writeln!(f, "Field '{}' does not exist.{}", field, suffix)
}
FieldError::Duplicate(ref cursor) => {
writeln!(f, "Value at '{}' was already set", cursor)
}
FieldError::Empty => writeln!(f, "Field names must not be empty."),
}
}
}
#[derive(Debug)]
pub enum CLIError {
Configuration(ConfigurationError),
ParseError(String, String, String, String),
UnknownParameter(String, Vec<&'static str>),
InvalidUploadProtocol(String, Vec<String>),
InvalidKeyValueSyntax(String, bool),
Input(InputError),
Field(FieldError),
MissingCommandError,
MissingMethodError(String),
}
impl fmt::Display for CLIError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match *self {
CLIError::Configuration(ref err) => write!(f, "Configuration -> {}", err),
CLIError::Input(ref err) => write!(f, "Input -> {}", err),
CLIError::Field(ref err) => write!(f, "Field -> {}", err),
CLIError::InvalidUploadProtocol(ref proto_name, ref valid_names) => writeln!(
f,
"'{}' is not a valid upload protocol. Choose from one of {}.",
proto_name,
valid_names.join(", ")
),
CLIError::ParseError(ref arg_name, ref type_name, ref value, ref err_desc) => writeln!(
f,
"Failed to parse argument '{}' with value '{}' as {} with error: {}.",
arg_name, value, type_name, err_desc
),
CLIError::UnknownParameter(ref param_name, ref possible_values) => {
let suffix = match did_you_mean(param_name, &possible_values) {
Some(v) => format!(" Did you mean '{}' ?", v),
None => String::new(),
};
writeln!(f, "Parameter '{}' is unknown.{}", param_name, suffix)
}
CLIError::InvalidKeyValueSyntax(ref kv, is_hashmap) => {
let hashmap_info = if is_hashmap { "hashmap " } else { "" };
writeln!(
f,
"'{}' does not match {}pattern <key>=<value>.",
kv, hashmap_info
)
}
CLIError::MissingCommandError => writeln!(f, "Please specify the main sub-command."),
CLIError::MissingMethodError(ref cmd) => writeln!(
f,
"Please specify the method to call on the '{}' command.",
cmd
),
}
}
}
#[derive(Debug)]
pub struct InvalidOptionsError {
pub issues: Vec<CLIError>,
pub exit_code: i32,
}
impl fmt::Display for InvalidOptionsError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
for issue in &self.issues {
issue.fmt(f)?;
}
Ok(())
}
}
impl InvalidOptionsError {
pub fn single(err: CLIError, exit_code: i32) -> InvalidOptionsError {
InvalidOptionsError {
issues: vec![err],
exit_code,
}
}
pub fn new() -> InvalidOptionsError {
InvalidOptionsError {
issues: Vec::new(),
exit_code: 1,
}
}
}
pub fn assure_config_dir_exists(dir: &str) -> Result<String, CLIError> {
let trdir = dir.trim();
if trdir.is_empty() {
return Err(CLIError::Configuration(ConfigurationError::DirectoryUnset));
}
let expanded_config_dir = if trdir.as_bytes()[0] == b'~' {
match env::var("HOME")
.ok()
.or_else(|| env::var("UserProfile").ok())
{
None => {
return Err(CLIError::Configuration(
ConfigurationError::HomeExpansionFailed(trdir.to_string()),
))
}
Some(mut user) => {
user.push_str(&trdir[1..]);
user
}
}
} else {
trdir.to_string()
};
if let Err(err) = fs::create_dir(&expanded_config_dir) {
if err.kind() != io::ErrorKind::AlreadyExists {
return Err(CLIError::Configuration(
ConfigurationError::DirectoryCreationFailed((expanded_config_dir, err)),
));
}
}
Ok(expanded_config_dir)
}
pub fn application_secret_from_directory(
dir: &str,
secret_basename: &str,
json_console_secret: &str,
) -> Result<ApplicationSecret, CLIError> {
let secret_path = Path::new(dir).join(secret_basename);
let secret_str = || secret_path.as_path().to_str().unwrap().to_string();
let secret_io_error = |io_err: io::Error| {
Err(CLIError::Configuration(ConfigurationError::Io((
secret_str(),
io_err,
))))
};
for _ in 0..2 {
match fs::File::open(&secret_path) {
Err(mut err) => {
if err.kind() == io::ErrorKind::NotFound {
// Write our built-in one - user may adjust the written file at will
err = match fs::OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(&secret_path)
{
Err(cfe) => cfe,
Ok(mut f) => {
// Assure we convert 'ugly' json string into pretty one
let console_secret: ConsoleApplicationSecret =
json::from_str(json_console_secret).unwrap();
match json::to_writer_pretty(&mut f, &console_secret) {
Err(serde_err) => {
panic!("Unexpected serde error: {:#?}", serde_err)
}
Ok(_) => continue,
}
}
};
// fall through to IO error handling
}
return secret_io_error(err);
}
Ok(f) => match json::de::from_reader::<_, ConsoleApplicationSecret>(f) {
Err(json_err) => {
return Err(CLIError::Configuration(ConfigurationError::Secret(
ApplicationSecretError::DecoderError((secret_str(), json_err)),
)))
}
Ok(console_secret) => match console_secret.installed {
Some(secret) => return Ok(secret),
None => {
return Err(CLIError::Configuration(ConfigurationError::Secret(
ApplicationSecretError::FormatError(secret_str()),
)))
}
},
},
}
}
unreachable!();
}

View File

@@ -3,8 +3,6 @@
// DO NOT EDIT !
#![allow(unused_variables, unused_imports, dead_code, unused_mut)]
extern crate tokio;
#[macro_use]
extern crate clap;
@@ -12,9 +10,10 @@ use std::env;
use std::io::{self, Write};
use clap::{App, SubCommand, Arg};
use google_datafusion1_beta1::{api, Error, oauth2};
use google_datafusion1_beta1::{api, Error, oauth2, client::chrono, FieldMask};
mod client;
use google_clis_common as client;
use client::{InvalidOptionsError, CLIError, arg_from_str, writer_from_opts, parse_kv_arg,
input_file_from_opts, input_mime_from_opts, FieldCursor, FieldError, CallType, UploadProtocol,
@@ -136,6 +135,9 @@ where
"enable-rbac" => Some(("enableRbac", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"enable-stackdriver-logging" => Some(("enableStackdriverLogging", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"enable-stackdriver-monitoring" => Some(("enableStackdriverMonitoring", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"enable-zone-separation" => Some(("enableZoneSeparation", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"event-publish-config.enabled" => Some(("eventPublishConfig.enabled", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"event-publish-config.topic" => Some(("eventPublishConfig.topic", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"gcs-bucket" => Some(("gcsBucket", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"labels" => Some(("labels", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Map })),
"name" => Some(("name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
@@ -154,7 +156,7 @@ where
"version" => Some(("version", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"zone" => Some(("zone", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
_ => {
let suggestion = FieldCursor::did_you_mean(key, &vec!["api-endpoint", "create-time", "crypto-key-config", "dataproc-service-account", "description", "disabled-reason", "display-name", "enable-rbac", "enable-stackdriver-logging", "enable-stackdriver-monitoring", "gcs-bucket", "ip-allocation", "key-reference", "labels", "name", "network", "network-config", "options", "p4-service-account", "private-instance", "service-account", "service-endpoint", "state", "state-message", "tenant-project-id", "type", "update-time", "version", "zone"]);
let suggestion = FieldCursor::did_you_mean(key, &vec!["api-endpoint", "create-time", "crypto-key-config", "dataproc-service-account", "description", "disabled-reason", "display-name", "enable-rbac", "enable-stackdriver-logging", "enable-stackdriver-monitoring", "enable-zone-separation", "enabled", "event-publish-config", "gcs-bucket", "ip-allocation", "key-reference", "labels", "name", "network", "network-config", "options", "p4-service-account", "private-instance", "service-account", "service-endpoint", "state", "state-message", "tenant-project-id", "topic", "type", "update-time", "version", "zone"]);
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
None
}
@@ -270,7 +272,7 @@ where
}
}
async fn _projects_locations_instances_dns_peerings_add(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
async fn _projects_locations_instances_dns_peerings_create(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
-> Result<(), DoitError> {
let mut field_cursor = FieldCursor::default();
@@ -293,13 +295,13 @@ where
let type_info: Option<(&'static str, JsonTypeInfo)> =
match &temp_cursor.to_string()[..] {
"dns-peering.description" => Some(("dnsPeering.description", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"dns-peering.domain" => Some(("dnsPeering.domain", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"dns-peering.target-network" => Some(("dnsPeering.targetNetwork", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"dns-peering.target-project" => Some(("dnsPeering.targetProject", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"dns-peering.zone" => Some(("dnsPeering.zone", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"description" => Some(("description", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"domain" => Some(("domain", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"name" => Some(("name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"target-network" => Some(("targetNetwork", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"target-project" => Some(("targetProject", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
_ => {
let suggestion = FieldCursor::did_you_mean(key, &vec!["description", "dns-peering", "domain", "target-network", "target-project", "zone"]);
let suggestion = FieldCursor::did_you_mean(key, &vec!["description", "domain", "name", "target-network", "target-project"]);
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
None
}
@@ -308,8 +310,64 @@ where
FieldCursor::from(field_cursor_str).set_json_value(&mut object, value.unwrap(), type_info, err, &temp_cursor);
}
}
let mut request: api::AddDnsPeeringRequest = json::value::from_value(object).unwrap();
let mut call = self.hub.projects().locations_instances_dns_peerings_add(request, opt.value_of("parent").unwrap_or(""));
let mut request: api::DnsPeering = json::value::from_value(object).unwrap();
let mut call = self.hub.projects().locations_instances_dns_peerings_create(request, opt.value_of("parent").unwrap_or(""));
for parg in opt.values_of("v").map(|i|i.collect()).unwrap_or(Vec::new()).iter() {
let (key, value) = parse_kv_arg(&*parg, err, false);
match key {
"dns-peering-id" => {
call = call.dns_peering_id(value.unwrap_or(""));
},
_ => {
let mut found = false;
for param in &self.gp {
if key == *param {
found = true;
call = call.param(self.gpm.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"));
break;
}
}
if !found {
err.issues.push(CLIError::UnknownParameter(key.to_string(),
{let mut v = Vec::new();
v.extend(self.gp.iter().map(|v|*v));
v.extend(["dns-peering-id"].iter().map(|v|*v));
v } ));
}
}
}
}
let protocol = CallType::Standard;
if dry_run {
Ok(())
} else {
assert!(err.issues.len() == 0);
for scope in self.opt.values_of("url").map(|i|i.collect()).unwrap_or(Vec::new()).iter() {
call = call.add_scope(scope);
}
let mut ostream = match writer_from_opts(opt.value_of("out")) {
Ok(mut f) => f,
Err(io_err) => return Err(DoitError::IoError(opt.value_of("out").unwrap_or("-").to_string(), io_err)),
};
match match protocol {
CallType::Standard => call.doit().await,
_ => unreachable!()
} {
Err(api_err) => Err(DoitError::ApiError(api_err)),
Ok((mut response, output_schema)) => {
let mut value = json::value::to_value(&output_schema).expect("serde to work");
remove_json_null_values(&mut value);
json::to_writer_pretty(&mut ostream, &value).unwrap();
ostream.flush().unwrap();
Ok(())
}
}
}
}
async fn _projects_locations_instances_dns_peerings_delete(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
-> Result<(), DoitError> {
let mut call = self.hub.projects().locations_instances_dns_peerings_delete(opt.value_of("name").unwrap_or(""));
for parg in opt.values_of("v").map(|i|i.collect()).unwrap_or(Vec::new()).iter() {
let (key, value) = parse_kv_arg(&*parg, err, false);
match key {
@@ -369,7 +427,7 @@ where
call = call.page_token(value.unwrap_or(""));
},
"page-size" => {
call = call.page_size(arg_from_str(value.unwrap_or("-0"), err, "page-size", "integer"));
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
},
_ => {
let mut found = false;
@@ -418,91 +476,6 @@ where
}
}
async fn _projects_locations_instances_dns_peerings_remove(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
-> Result<(), DoitError> {
let mut field_cursor = FieldCursor::default();
let mut object = json::value::Value::Object(Default::default());
for kvarg in opt.values_of("kv").map(|i|i.collect()).unwrap_or(Vec::new()).iter() {
let last_errc = err.issues.len();
let (key, value) = parse_kv_arg(&*kvarg, err, false);
let mut temp_cursor = field_cursor.clone();
if let Err(field_err) = temp_cursor.set(&*key) {
err.issues.push(field_err);
}
if value.is_none() {
field_cursor = temp_cursor.clone();
if err.issues.len() > last_errc {
err.issues.remove(last_errc);
}
continue;
}
let type_info: Option<(&'static str, JsonTypeInfo)> =
match &temp_cursor.to_string()[..] {
"zone" => Some(("zone", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
_ => {
let suggestion = FieldCursor::did_you_mean(key, &vec!["zone"]);
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
None
}
};
if let Some((field_cursor_str, type_info)) = type_info {
FieldCursor::from(field_cursor_str).set_json_value(&mut object, value.unwrap(), type_info, err, &temp_cursor);
}
}
let mut request: api::RemoveDnsPeeringRequest = json::value::from_value(object).unwrap();
let mut call = self.hub.projects().locations_instances_dns_peerings_remove(request, opt.value_of("parent").unwrap_or(""));
for parg in opt.values_of("v").map(|i|i.collect()).unwrap_or(Vec::new()).iter() {
let (key, value) = parse_kv_arg(&*parg, err, false);
match key {
_ => {
let mut found = false;
for param in &self.gp {
if key == *param {
found = true;
call = call.param(self.gpm.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"));
break;
}
}
if !found {
err.issues.push(CLIError::UnknownParameter(key.to_string(),
{let mut v = Vec::new();
v.extend(self.gp.iter().map(|v|*v));
v } ));
}
}
}
}
let protocol = CallType::Standard;
if dry_run {
Ok(())
} else {
assert!(err.issues.len() == 0);
for scope in self.opt.values_of("url").map(|i|i.collect()).unwrap_or(Vec::new()).iter() {
call = call.add_scope(scope);
}
let mut ostream = match writer_from_opts(opt.value_of("out")) {
Ok(mut f) => f,
Err(io_err) => return Err(DoitError::IoError(opt.value_of("out").unwrap_or("-").to_string(), io_err)),
};
match match protocol {
CallType::Standard => call.doit().await,
_ => unreachable!()
} {
Err(api_err) => Err(DoitError::ApiError(api_err)),
Ok((mut response, output_schema)) => {
let mut value = json::value::to_value(&output_schema).expect("serde to work");
remove_json_null_values(&mut value);
json::to_writer_pretty(&mut ostream, &value).unwrap();
ostream.flush().unwrap();
Ok(())
}
}
}
}
async fn _projects_locations_instances_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
-> Result<(), DoitError> {
let mut call = self.hub.projects().locations_instances_get(opt.value_of("name").unwrap_or(""));
@@ -562,7 +535,7 @@ where
let (key, value) = parse_kv_arg(&*parg, err, false);
match key {
"options-requested-policy-version" => {
call = call.options_requested_policy_version(arg_from_str(value.unwrap_or("-0"), err, "options-requested-policy-version", "integer"));
call = call.options_requested_policy_version( value.map(|v| arg_from_str(v, err, "options-requested-policy-version", "int32")).unwrap_or(-0));
},
_ => {
let mut found = false;
@@ -621,7 +594,7 @@ where
call = call.page_token(value.unwrap_or(""));
},
"page-size" => {
call = call.page_size(arg_from_str(value.unwrap_or("-0"), err, "page-size", "integer"));
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
},
"order-by" => {
call = call.order_by(value.unwrap_or(""));
@@ -683,7 +656,7 @@ where
let (key, value) = parse_kv_arg(&*parg, err, false);
match key {
"options-requested-policy-version" => {
call = call.options_requested_policy_version(arg_from_str(value.unwrap_or("-0"), err, "options-requested-policy-version", "integer"));
call = call.options_requested_policy_version( value.map(|v| arg_from_str(v, err, "options-requested-policy-version", "int32")).unwrap_or(-0));
},
_ => {
let mut found = false;
@@ -745,7 +718,7 @@ where
call = call.page_token(value.unwrap_or(""));
},
"page-size" => {
call = call.page_size(arg_from_str(value.unwrap_or("-0"), err, "page-size", "integer"));
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
},
_ => {
let mut found = false;
@@ -999,6 +972,9 @@ where
"enable-rbac" => Some(("enableRbac", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"enable-stackdriver-logging" => Some(("enableStackdriverLogging", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"enable-stackdriver-monitoring" => Some(("enableStackdriverMonitoring", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"enable-zone-separation" => Some(("enableZoneSeparation", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"event-publish-config.enabled" => Some(("eventPublishConfig.enabled", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
"event-publish-config.topic" => Some(("eventPublishConfig.topic", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"gcs-bucket" => Some(("gcsBucket", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"labels" => Some(("labels", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Map })),
"name" => Some(("name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
@@ -1017,7 +993,7 @@ where
"version" => Some(("version", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
"zone" => Some(("zone", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
_ => {
let suggestion = FieldCursor::did_you_mean(key, &vec!["api-endpoint", "create-time", "crypto-key-config", "dataproc-service-account", "description", "disabled-reason", "display-name", "enable-rbac", "enable-stackdriver-logging", "enable-stackdriver-monitoring", "gcs-bucket", "ip-allocation", "key-reference", "labels", "name", "network", "network-config", "options", "p4-service-account", "private-instance", "service-account", "service-endpoint", "state", "state-message", "tenant-project-id", "type", "update-time", "version", "zone"]);
let suggestion = FieldCursor::did_you_mean(key, &vec!["api-endpoint", "create-time", "crypto-key-config", "dataproc-service-account", "description", "disabled-reason", "display-name", "enable-rbac", "enable-stackdriver-logging", "enable-stackdriver-monitoring", "enable-zone-separation", "enabled", "event-publish-config", "gcs-bucket", "ip-allocation", "key-reference", "labels", "name", "network", "network-config", "options", "p4-service-account", "private-instance", "service-account", "service-endpoint", "state", "state-message", "tenant-project-id", "topic", "type", "update-time", "version", "zone"]);
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
None
}
@@ -1032,7 +1008,7 @@ where
let (key, value) = parse_kv_arg(&*parg, err, false);
match key {
"update-mask" => {
call = call.update_mask(value.unwrap_or(""));
call = call.update_mask( value.map(|v| arg_from_str(v, err, "update-mask", "google-fieldmask")).unwrap_or(FieldMask::default()));
},
_ => {
let mut found = false;
@@ -1431,10 +1407,10 @@ where
call = call.page_token(value.unwrap_or(""));
},
"page-size" => {
call = call.page_size(arg_from_str(value.unwrap_or("-0"), err, "page-size", "integer"));
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
},
"include-unrevealed-locations" => {
call = call.include_unrevealed_locations(arg_from_str(value.unwrap_or("false"), err, "include-unrevealed-locations", "boolean"));
call = call.include_unrevealed_locations( value.map(|v| arg_from_str(v, err, "include-unrevealed-locations", "boolean")).unwrap_or(false));
},
"filter" => {
call = call.filter(value.unwrap_or(""));
@@ -1684,7 +1660,7 @@ where
call = call.page_token(value.unwrap_or(""));
},
"page-size" => {
call = call.page_size(arg_from_str(value.unwrap_or("-0"), err, "page-size", "integer"));
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
},
"filter" => {
call = call.filter(value.unwrap_or(""));
@@ -1830,10 +1806,10 @@ where
call = call.page_token(value.unwrap_or(""));
},
"page-size" => {
call = call.page_size(arg_from_str(value.unwrap_or("-0"), err, "page-size", "integer"));
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
},
"latest-patch-only" => {
call = call.latest_patch_only(arg_from_str(value.unwrap_or("false"), err, "latest-patch-only", "boolean"));
call = call.latest_patch_only( value.map(|v| arg_from_str(v, err, "latest-patch-only", "boolean")).unwrap_or(false));
},
_ => {
let mut found = false;
@@ -1898,15 +1874,15 @@ where
("locations-instances-delete", Some(opt)) => {
call_result = self._projects_locations_instances_delete(opt, dry_run, &mut err).await;
},
("locations-instances-dns-peerings-add", Some(opt)) => {
call_result = self._projects_locations_instances_dns_peerings_add(opt, dry_run, &mut err).await;
("locations-instances-dns-peerings-create", Some(opt)) => {
call_result = self._projects_locations_instances_dns_peerings_create(opt, dry_run, &mut err).await;
},
("locations-instances-dns-peerings-delete", Some(opt)) => {
call_result = self._projects_locations_instances_dns_peerings_delete(opt, dry_run, &mut err).await;
},
("locations-instances-dns-peerings-list", Some(opt)) => {
call_result = self._projects_locations_instances_dns_peerings_list(opt, dry_run, &mut err).await;
},
("locations-instances-dns-peerings-remove", Some(opt)) => {
call_result = self._projects_locations_instances_dns_peerings_remove(opt, dry_run, &mut err).await;
},
("locations-instances-get", Some(opt)) => {
call_result = self._projects_locations_instances_get(opt, dry_run, &mut err).await;
},
@@ -2043,7 +2019,7 @@ where
async fn main() {
let mut exit_status = 0i32;
let arg_data = [
("projects", "methods: 'locations-get', 'locations-instances-create', 'locations-instances-delete', 'locations-instances-dns-peerings-add', 'locations-instances-dns-peerings-list', 'locations-instances-dns-peerings-remove', 'locations-instances-get', 'locations-instances-get-iam-policy', 'locations-instances-list', 'locations-instances-namespaces-get-iam-policy', 'locations-instances-namespaces-list', 'locations-instances-namespaces-set-iam-policy', 'locations-instances-namespaces-test-iam-permissions', 'locations-instances-patch', 'locations-instances-restart', 'locations-instances-set-iam-policy', 'locations-instances-test-iam-permissions', 'locations-instances-upgrade', 'locations-list', 'locations-operations-cancel', 'locations-operations-delete', 'locations-operations-get', 'locations-operations-list', 'locations-remove-iam-policy' and 'locations-versions-list'", vec![
("projects", "methods: 'locations-get', 'locations-instances-create', 'locations-instances-delete', 'locations-instances-dns-peerings-create', 'locations-instances-dns-peerings-delete', 'locations-instances-dns-peerings-list', 'locations-instances-get', 'locations-instances-get-iam-policy', 'locations-instances-list', 'locations-instances-namespaces-get-iam-policy', 'locations-instances-namespaces-list', 'locations-instances-namespaces-set-iam-policy', 'locations-instances-namespaces-test-iam-permissions', 'locations-instances-patch', 'locations-instances-restart', 'locations-instances-set-iam-policy', 'locations-instances-test-iam-permissions', 'locations-instances-upgrade', 'locations-list', 'locations-operations-cancel', 'locations-operations-delete', 'locations-operations-get', 'locations-operations-list', 'locations-remove-iam-policy' and 'locations-versions-list'", vec![
("locations-get",
Some(r##"Gets information about a location."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-get",
@@ -2116,9 +2092,9 @@ async fn main() {
Some(false),
Some(false)),
]),
("locations-instances-dns-peerings-add",
Some(r##"Add DNS peering on the given resource."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-instances-dns-peerings-add",
("locations-instances-dns-peerings-create",
Some(r##"Creates DNS peering on the given resource."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-instances-dns-peerings-create",
vec![
(Some(r##"parent"##),
None,
@@ -2144,13 +2120,13 @@ async fn main() {
Some(false),
Some(false)),
]),
("locations-instances-dns-peerings-list",
Some(r##"List DNS peering for a given resource."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-instances-dns-peerings-list",
("locations-instances-dns-peerings-delete",
Some(r##"Deletes DNS peering on the given resource."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-instances-dns-peerings-delete",
vec![
(Some(r##"parent"##),
(Some(r##"name"##),
None,
Some(r##"Required. The resource on which dns peering will be listed."##),
Some(r##"Required. The name of the DNS peering zone to delete. Format: projects/{project}/locations/{location}/instances/{instance}/dnsPeerings/{dns_peering}"##),
Some(true),
Some(false)),
@@ -2166,22 +2142,16 @@ async fn main() {
Some(false),
Some(false)),
]),
("locations-instances-dns-peerings-remove",
Some(r##"Remove DNS peering on the given resource."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-instances-dns-peerings-remove",
("locations-instances-dns-peerings-list",
Some(r##"Lists DNS peerings for a given resource."##),
"Details at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli/projects_locations-instances-dns-peerings-list",
vec![
(Some(r##"parent"##),
None,
Some(r##"Required. The resource on which DNS peering will be removed."##),
Some(r##"Required. The parent, which owns this collection of dns peerings. Format: projects/{project}/locations/{location}/instances/{instance}"##),
Some(true),
Some(false)),
(Some(r##"kv"##),
Some(r##"r"##),
Some(r##"Set various fields of the request structure, matching the key=value form"##),
Some(true),
Some(true)),
(Some(r##"v"##),
Some(r##"p"##),
Some(r##"Set various optional parameters, matching the key=value form"##),
@@ -2222,7 +2192,7 @@ async fn main() {
vec![
(Some(r##"resource"##),
None,
Some(r##"REQUIRED: The resource for which the policy is being requested. See the operation documentation for the appropriate value for this field."##),
Some(r##"REQUIRED: The resource for which the policy is being requested. See [Resource names](https://cloud.google.com/apis/design/resource_names) for the appropriate value for this field."##),
Some(true),
Some(false)),
@@ -2266,7 +2236,7 @@ async fn main() {
vec![
(Some(r##"resource"##),
None,
Some(r##"REQUIRED: The resource for which the policy is being requested. See the operation documentation for the appropriate value for this field."##),
Some(r##"REQUIRED: The resource for which the policy is being requested. See [Resource names](https://cloud.google.com/apis/design/resource_names) for the appropriate value for this field."##),
Some(true),
Some(false)),
@@ -2310,7 +2280,7 @@ async fn main() {
vec![
(Some(r##"resource"##),
None,
Some(r##"REQUIRED: The resource for which the policy is being specified. See the operation documentation for the appropriate value for this field."##),
Some(r##"REQUIRED: The resource for which the policy is being specified. See [Resource names](https://cloud.google.com/apis/design/resource_names) for the appropriate value for this field."##),
Some(true),
Some(false)),
@@ -2338,7 +2308,7 @@ async fn main() {
vec![
(Some(r##"resource"##),
None,
Some(r##"REQUIRED: The resource for which the policy detail is being requested. See the operation documentation for the appropriate value for this field."##),
Some(r##"REQUIRED: The resource for which the policy detail is being requested. See [Resource names](https://cloud.google.com/apis/design/resource_names) for the appropriate value for this field."##),
Some(true),
Some(false)),
@@ -2422,7 +2392,7 @@ async fn main() {
vec![
(Some(r##"resource"##),
None,
Some(r##"REQUIRED: The resource for which the policy is being specified. See the operation documentation for the appropriate value for this field."##),
Some(r##"REQUIRED: The resource for which the policy is being specified. See [Resource names](https://cloud.google.com/apis/design/resource_names) for the appropriate value for this field."##),
Some(true),
Some(false)),
@@ -2450,7 +2420,7 @@ async fn main() {
vec![
(Some(r##"resource"##),
None,
Some(r##"REQUIRED: The resource for which the policy detail is being requested. See the operation documentation for the appropriate value for this field."##),
Some(r##"REQUIRED: The resource for which the policy detail is being requested. See [Resource names](https://cloud.google.com/apis/design/resource_names) for the appropriate value for this field."##),
Some(true),
Some(false)),
@@ -2672,7 +2642,7 @@ async fn main() {
let mut app = App::new("datafusion1-beta1")
.author("Sebastian Thiel <byronimo@gmail.com>")
.version("4.0.1+20211028")
.version("5.0.2+20221213")
.about("Cloud Data Fusion is a fully-managed, cloud native, enterprise data integration service for quickly building and managing data pipelines. It provides a graphical interface to increase time efficiency and reduce complexity, and allows business users, developers, and data scientists to easily and reliably build scalable data integration solutions to cleanse, prepare, blend, transfer and transform data without having to wrestle with infrastructure.")
.after_help("All documentation details can be found at http://byron.github.io/google-apis-rs/google_datafusion1_beta1_cli")
.arg(Arg::with_name("url")