mirror of
https://github.com/OMGeeky/google-apis-rs.git
synced 2026-02-23 15:49:49 +01:00
rebuild all APIS
This commit is contained in:
@@ -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!();
|
||||
}
|
||||
@@ -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_pubsub1::{api, Error, oauth2};
|
||||
use google_pubsub1::{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,
|
||||
@@ -51,6 +50,95 @@ where
|
||||
S::Future: Send + Unpin + 'static,
|
||||
S::Error: Into<Box<dyn StdError + Send + Sync>>,
|
||||
{
|
||||
async fn _projects_schemas_commit(&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()[..] {
|
||||
"schema.definition" => Some(("schema.definition", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.name" => Some(("schema.name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.revision-create-time" => Some(("schema.revisionCreateTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.revision-id" => Some(("schema.revisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.type" => Some(("schema.type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "name", "revision-create-time", "revision-id", "schema", "type"]);
|
||||
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::CommitSchemaRequest = json::value::from_value(object).unwrap();
|
||||
let mut call = self.hub.projects().schemas_commit(request, 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 {
|
||||
_ => {
|
||||
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_schemas_create(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||||
-> Result<(), DoitError> {
|
||||
|
||||
@@ -76,9 +164,11 @@ where
|
||||
match &temp_cursor.to_string()[..] {
|
||||
"definition" => Some(("definition", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"name" => Some(("name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"revision-create-time" => Some(("revisionCreateTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"revision-id" => Some(("revisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"type" => Some(("type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "name", "type"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "name", "revision-create-time", "revision-id", "type"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -194,6 +284,62 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
async fn _projects_schemas_delete_revision(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||||
-> Result<(), DoitError> {
|
||||
let mut call = self.hub.projects().schemas_delete_revision(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 {
|
||||
"revision-id" => {
|
||||
call = call.revision_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(["revision-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_schemas_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||||
-> Result<(), DoitError> {
|
||||
let mut call = self.hub.projects().schemas_get(opt.value_of("name").unwrap_or(""));
|
||||
@@ -257,7 +403,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;
|
||||
@@ -319,7 +465,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;
|
||||
@@ -368,6 +514,153 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
async fn _projects_schemas_list_revisions(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||||
-> Result<(), DoitError> {
|
||||
let mut call = self.hub.projects().schemas_list_revisions(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 {
|
||||
"view" => {
|
||||
call = call.view(value.unwrap_or(""));
|
||||
},
|
||||
"page-token" => {
|
||||
call = call.page_token(value.unwrap_or(""));
|
||||
},
|
||||
"page-size" => {
|
||||
call = call.page_size( value.map(|v| arg_from_str(v, err, "page-size", "int32")).unwrap_or(-0));
|
||||
},
|
||||
_ => {
|
||||
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(["page-size", "page-token", "view"].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_schemas_rollback(&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()[..] {
|
||||
"revision-id" => Some(("revisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["revision-id"]);
|
||||
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::RollbackSchemaRequest = json::value::from_value(object).unwrap();
|
||||
let mut call = self.hub.projects().schemas_rollback(request, 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 {
|
||||
_ => {
|
||||
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_schemas_set_iam_policy(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||||
-> Result<(), DoitError> {
|
||||
|
||||
@@ -564,9 +857,11 @@ where
|
||||
match &temp_cursor.to_string()[..] {
|
||||
"schema.definition" => Some(("schema.definition", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.name" => Some(("schema.name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.revision-create-time" => Some(("schema.revisionCreateTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.revision-id" => Some(("schema.revisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.type" => Some(("schema.type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "name", "schema", "type"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "name", "revision-create-time", "revision-id", "schema", "type"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -654,9 +949,11 @@ where
|
||||
"name" => Some(("name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.definition" => Some(("schema.definition", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.name" => Some(("schema.name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.revision-create-time" => Some(("schema.revisionCreateTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.revision-id" => Some(("schema.revisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema.type" => Some(("schema.type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "encoding", "message", "name", "schema", "type"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["definition", "encoding", "message", "name", "revision-create-time", "revision-id", "schema", "type"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -913,7 +1210,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;
|
||||
@@ -972,7 +1269,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;
|
||||
@@ -1390,6 +1687,11 @@ where
|
||||
let type_info: Option<(&'static str, JsonTypeInfo)> =
|
||||
match &temp_cursor.to_string()[..] {
|
||||
"ack-deadline-seconds" => Some(("ackDeadlineSeconds", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||||
"bigquery-config.drop-unknown-fields" => Some(("bigqueryConfig.dropUnknownFields", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"bigquery-config.state" => Some(("bigqueryConfig.state", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"bigquery-config.table" => Some(("bigqueryConfig.table", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"bigquery-config.use-topic-schema" => Some(("bigqueryConfig.useTopicSchema", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"bigquery-config.write-metadata" => Some(("bigqueryConfig.writeMetadata", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"dead-letter-policy.dead-letter-topic" => Some(("deadLetterPolicy.deadLetterTopic", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"dead-letter-policy.max-delivery-attempts" => Some(("deadLetterPolicy.maxDeliveryAttempts", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||||
"detached" => Some(("detached", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
@@ -1411,7 +1713,7 @@ where
|
||||
"topic" => Some(("topic", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"topic-message-retention-duration" => Some(("topicMessageRetentionDuration", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["ack-deadline-seconds", "attributes", "audience", "dead-letter-policy", "dead-letter-topic", "detached", "enable-exactly-once-delivery", "enable-message-ordering", "expiration-policy", "filter", "labels", "max-delivery-attempts", "maximum-backoff", "message-retention-duration", "minimum-backoff", "name", "oidc-token", "push-config", "push-endpoint", "retain-acked-messages", "retry-policy", "service-account-email", "state", "topic", "topic-message-retention-duration", "ttl"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["ack-deadline-seconds", "attributes", "audience", "bigquery-config", "dead-letter-policy", "dead-letter-topic", "detached", "drop-unknown-fields", "enable-exactly-once-delivery", "enable-message-ordering", "expiration-policy", "filter", "labels", "max-delivery-attempts", "maximum-backoff", "message-retention-duration", "minimum-backoff", "name", "oidc-token", "push-config", "push-endpoint", "retain-acked-messages", "retry-policy", "service-account-email", "state", "table", "topic", "topic-message-retention-duration", "ttl", "use-topic-schema", "write-metadata"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -1634,7 +1936,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;
|
||||
@@ -1693,7 +1995,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;
|
||||
@@ -1940,6 +2242,11 @@ where
|
||||
let type_info: Option<(&'static str, JsonTypeInfo)> =
|
||||
match &temp_cursor.to_string()[..] {
|
||||
"subscription.ack-deadline-seconds" => Some(("subscription.ackDeadlineSeconds", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||||
"subscription.bigquery-config.drop-unknown-fields" => Some(("subscription.bigqueryConfig.dropUnknownFields", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"subscription.bigquery-config.state" => Some(("subscription.bigqueryConfig.state", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"subscription.bigquery-config.table" => Some(("subscription.bigqueryConfig.table", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"subscription.bigquery-config.use-topic-schema" => Some(("subscription.bigqueryConfig.useTopicSchema", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"subscription.bigquery-config.write-metadata" => Some(("subscription.bigqueryConfig.writeMetadata", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"subscription.dead-letter-policy.dead-letter-topic" => Some(("subscription.deadLetterPolicy.deadLetterTopic", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"subscription.dead-letter-policy.max-delivery-attempts" => Some(("subscription.deadLetterPolicy.maxDeliveryAttempts", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||||
"subscription.detached" => Some(("subscription.detached", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
@@ -1962,7 +2269,7 @@ where
|
||||
"subscription.topic-message-retention-duration" => Some(("subscription.topicMessageRetentionDuration", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"update-mask" => Some(("updateMask", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["ack-deadline-seconds", "attributes", "audience", "dead-letter-policy", "dead-letter-topic", "detached", "enable-exactly-once-delivery", "enable-message-ordering", "expiration-policy", "filter", "labels", "max-delivery-attempts", "maximum-backoff", "message-retention-duration", "minimum-backoff", "name", "oidc-token", "push-config", "push-endpoint", "retain-acked-messages", "retry-policy", "service-account-email", "state", "subscription", "topic", "topic-message-retention-duration", "ttl", "update-mask"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["ack-deadline-seconds", "attributes", "audience", "bigquery-config", "dead-letter-policy", "dead-letter-topic", "detached", "drop-unknown-fields", "enable-exactly-once-delivery", "enable-message-ordering", "expiration-policy", "filter", "labels", "max-delivery-attempts", "maximum-backoff", "message-retention-duration", "minimum-backoff", "name", "oidc-token", "push-config", "push-endpoint", "retain-acked-messages", "retry-policy", "service-account-email", "state", "subscription", "table", "topic", "topic-message-retention-duration", "ttl", "update-mask", "use-topic-schema", "write-metadata"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -2395,9 +2702,11 @@ where
|
||||
"name" => Some(("name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"satisfies-pzs" => Some(("satisfiesPzs", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"schema-settings.encoding" => Some(("schemaSettings.encoding", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema-settings.first-revision-id" => Some(("schemaSettings.firstRevisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema-settings.last-revision-id" => Some(("schemaSettings.lastRevisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"schema-settings.schema" => Some(("schemaSettings.schema", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["allowed-persistence-regions", "encoding", "kms-key-name", "labels", "message-retention-duration", "message-storage-policy", "name", "satisfies-pzs", "schema", "schema-settings"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["allowed-persistence-regions", "encoding", "first-revision-id", "kms-key-name", "labels", "last-revision-id", "message-retention-duration", "message-storage-policy", "name", "satisfies-pzs", "schema", "schema-settings"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -2568,7 +2877,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;
|
||||
@@ -2627,7 +2936,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;
|
||||
@@ -2706,10 +3015,12 @@ where
|
||||
"topic.name" => Some(("topic.name", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"topic.satisfies-pzs" => Some(("topic.satisfiesPzs", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||||
"topic.schema-settings.encoding" => Some(("topic.schemaSettings.encoding", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"topic.schema-settings.first-revision-id" => Some(("topic.schemaSettings.firstRevisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"topic.schema-settings.last-revision-id" => Some(("topic.schemaSettings.lastRevisionId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"topic.schema-settings.schema" => Some(("topic.schemaSettings.schema", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
"update-mask" => Some(("updateMask", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||||
_ => {
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["allowed-persistence-regions", "encoding", "kms-key-name", "labels", "message-retention-duration", "message-storage-policy", "name", "satisfies-pzs", "schema", "schema-settings", "topic", "update-mask"]);
|
||||
let suggestion = FieldCursor::did_you_mean(key, &vec!["allowed-persistence-regions", "encoding", "first-revision-id", "kms-key-name", "labels", "last-revision-id", "message-retention-duration", "message-storage-policy", "name", "satisfies-pzs", "schema", "schema-settings", "topic", "update-mask"]);
|
||||
err.issues.push(CLIError::Field(FieldError::Unknown(temp_cursor.to_string(), suggestion, value.map(|v| v.to_string()))));
|
||||
None
|
||||
}
|
||||
@@ -2949,7 +3260,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;
|
||||
@@ -3008,7 +3319,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;
|
||||
@@ -3149,12 +3460,18 @@ where
|
||||
match self.opt.subcommand() {
|
||||
("projects", Some(opt)) => {
|
||||
match opt.subcommand() {
|
||||
("schemas-commit", Some(opt)) => {
|
||||
call_result = self._projects_schemas_commit(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-create", Some(opt)) => {
|
||||
call_result = self._projects_schemas_create(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-delete", Some(opt)) => {
|
||||
call_result = self._projects_schemas_delete(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-delete-revision", Some(opt)) => {
|
||||
call_result = self._projects_schemas_delete_revision(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-get", Some(opt)) => {
|
||||
call_result = self._projects_schemas_get(opt, dry_run, &mut err).await;
|
||||
},
|
||||
@@ -3164,6 +3481,12 @@ where
|
||||
("schemas-list", Some(opt)) => {
|
||||
call_result = self._projects_schemas_list(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-list-revisions", Some(opt)) => {
|
||||
call_result = self._projects_schemas_list_revisions(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-rollback", Some(opt)) => {
|
||||
call_result = self._projects_schemas_rollback(opt, dry_run, &mut err).await;
|
||||
},
|
||||
("schemas-set-iam-policy", Some(opt)) => {
|
||||
call_result = self._projects_schemas_set_iam_policy(opt, dry_run, &mut err).await;
|
||||
},
|
||||
@@ -3354,7 +3677,35 @@ where
|
||||
async fn main() {
|
||||
let mut exit_status = 0i32;
|
||||
let arg_data = [
|
||||
("projects", "methods: 'schemas-create', 'schemas-delete', 'schemas-get', 'schemas-get-iam-policy', 'schemas-list', 'schemas-set-iam-policy', 'schemas-test-iam-permissions', 'schemas-validate', 'schemas-validate-message', 'snapshots-create', 'snapshots-delete', 'snapshots-get', 'snapshots-get-iam-policy', 'snapshots-list', 'snapshots-patch', 'snapshots-set-iam-policy', 'snapshots-test-iam-permissions', 'subscriptions-acknowledge', 'subscriptions-create', 'subscriptions-delete', 'subscriptions-detach', 'subscriptions-get', 'subscriptions-get-iam-policy', 'subscriptions-list', 'subscriptions-modify-ack-deadline', 'subscriptions-modify-push-config', 'subscriptions-patch', 'subscriptions-pull', 'subscriptions-seek', 'subscriptions-set-iam-policy', 'subscriptions-test-iam-permissions', 'topics-create', 'topics-delete', 'topics-get', 'topics-get-iam-policy', 'topics-list', 'topics-patch', 'topics-publish', 'topics-set-iam-policy', 'topics-snapshots-list', 'topics-subscriptions-list' and 'topics-test-iam-permissions'", vec![
|
||||
("projects", "methods: 'schemas-commit', 'schemas-create', 'schemas-delete', 'schemas-delete-revision', 'schemas-get', 'schemas-get-iam-policy', 'schemas-list', 'schemas-list-revisions', 'schemas-rollback', 'schemas-set-iam-policy', 'schemas-test-iam-permissions', 'schemas-validate', 'schemas-validate-message', 'snapshots-create', 'snapshots-delete', 'snapshots-get', 'snapshots-get-iam-policy', 'snapshots-list', 'snapshots-patch', 'snapshots-set-iam-policy', 'snapshots-test-iam-permissions', 'subscriptions-acknowledge', 'subscriptions-create', 'subscriptions-delete', 'subscriptions-detach', 'subscriptions-get', 'subscriptions-get-iam-policy', 'subscriptions-list', 'subscriptions-modify-ack-deadline', 'subscriptions-modify-push-config', 'subscriptions-patch', 'subscriptions-pull', 'subscriptions-seek', 'subscriptions-set-iam-policy', 'subscriptions-test-iam-permissions', 'topics-create', 'topics-delete', 'topics-get', 'topics-get-iam-policy', 'topics-list', 'topics-patch', 'topics-publish', 'topics-set-iam-policy', 'topics-snapshots-list', 'topics-subscriptions-list' and 'topics-test-iam-permissions'", vec![
|
||||
("schemas-commit",
|
||||
Some(r##"Commits a new schema revision to an existing schema."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_schemas-commit",
|
||||
vec![
|
||||
(Some(r##"name"##),
|
||||
None,
|
||||
Some(r##"Required. The name of the schema we are revising. Format is `projects/{project}/schemas/{schema}`."##),
|
||||
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"##),
|
||||
Some(false),
|
||||
Some(true)),
|
||||
|
||||
(Some(r##"out"##),
|
||||
Some(r##"o"##),
|
||||
Some(r##"Specify the file into which to write the program's output"##),
|
||||
Some(false),
|
||||
Some(false)),
|
||||
]),
|
||||
("schemas-create",
|
||||
Some(r##"Creates a schema."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_schemas-create",
|
||||
@@ -3399,6 +3750,28 @@ async fn main() {
|
||||
Some(false),
|
||||
Some(true)),
|
||||
|
||||
(Some(r##"out"##),
|
||||
Some(r##"o"##),
|
||||
Some(r##"Specify the file into which to write the program's output"##),
|
||||
Some(false),
|
||||
Some(false)),
|
||||
]),
|
||||
("schemas-delete-revision",
|
||||
Some(r##"Deletes a specific schema revision."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_schemas-delete-revision",
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3465,6 +3838,56 @@ async fn main() {
|
||||
Some(false),
|
||||
Some(true)),
|
||||
|
||||
(Some(r##"out"##),
|
||||
Some(r##"o"##),
|
||||
Some(r##"Specify the file into which to write the program's output"##),
|
||||
Some(false),
|
||||
Some(false)),
|
||||
]),
|
||||
("schemas-list-revisions",
|
||||
Some(r##"Lists all schema revisions for the named schema."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_schemas-list-revisions",
|
||||
vec![
|
||||
(Some(r##"name"##),
|
||||
None,
|
||||
Some(r##"Required. The name of the schema to list revisions for."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
(Some(r##"v"##),
|
||||
Some(r##"p"##),
|
||||
Some(r##"Set various optional parameters, matching the key=value form"##),
|
||||
Some(false),
|
||||
Some(true)),
|
||||
|
||||
(Some(r##"out"##),
|
||||
Some(r##"o"##),
|
||||
Some(r##"Specify the file into which to write the program's output"##),
|
||||
Some(false),
|
||||
Some(false)),
|
||||
]),
|
||||
("schemas-rollback",
|
||||
Some(r##"Creates a new schema revision that is a copy of the provided revision_id."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_schemas-rollback",
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3505,7 +3928,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3589,7 +4012,7 @@ async fn main() {
|
||||
vec. Format is `projects/{project}/snapshots/{snap}`."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3634,7 +4057,7 @@ async fn main() {
|
||||
Some(false)),
|
||||
]),
|
||||
("snapshots-get",
|
||||
Some(r##"Gets the configuration details of a snapshot. Snapshots are used in Seek operations, which allow you to manage message acknowledgments in bulk. That is, you can set the acknowledgment state of messages in an existing subscription to the state captured by a snapshot."##),
|
||||
Some(r##"Gets the configuration details of a snapshot. Snapshots are used in [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, which allow you to manage message acknowledgments in bulk. That is, you can set the acknowledgment state of messages in an existing subscription to the state captured by a snapshot."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_snapshots-get",
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3700,7 +4123,7 @@ async fn main() {
|
||||
Some(false)),
|
||||
]),
|
||||
("snapshots-patch",
|
||||
Some(r##"Updates an existing snapshot. Snapshots are used in Seek operations, which allow you to manage message acknowledgments in bulk. That is, you can set the acknowledgment state of messages in an existing subscription to the state captured by a snapshot."##),
|
||||
Some(r##"Updates an existing snapshot. Snapshots are used in [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, which allow you to manage message acknowledgments in bulk. That is, you can set the acknowledgment state of messages in an existing subscription to the state captured by a snapshot."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_snapshots-patch",
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3761,7 +4184,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -3911,7 +4334,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -4034,7 +4457,7 @@ async fn main() {
|
||||
Some(false)),
|
||||
]),
|
||||
("subscriptions-pull",
|
||||
Some(r##"Pulls messages from the server. The server may return `UNAVAILABLE` if there are too many concurrent pull requests pending for the given subscription."##),
|
||||
Some(r##"Pulls messages from the server."##),
|
||||
"Details at http://byron.github.io/google-apis-rs/google_pubsub1_cli/projects_subscriptions-pull",
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -4123,7 +4546,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -4223,7 +4646,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -4323,7 +4746,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -4395,7 +4818,7 @@ async fn main() {
|
||||
vec for the appropriate value for this field."##),
|
||||
Some(true),
|
||||
Some(false)),
|
||||
|
||||
@@ -4423,7 +4846,7 @@ async fn main() {
|
||||
|
||||
let mut app = App::new("pubsub1")
|
||||
.author("Sebastian Thiel <byronimo@gmail.com>")
|
||||
.version("4.0.1+20220221")
|
||||
.version("5.0.2+20230119")
|
||||
.about("Provides reliable, many-to-many, asynchronous messaging between applications. ")
|
||||
.after_help("All documentation details can be found at http://byron.github.io/google-apis-rs/google_pubsub1_cli")
|
||||
.arg(Arg::with_name("url")
|
||||
|
||||
Reference in New Issue
Block a user