mirror of
https://github.com/OMGeeky/google-apis-rs.git
synced 2026-01-02 17:42:16 +01:00
2663 lines
138 KiB
Rust
2663 lines
138 KiB
Rust
// DO NOT EDIT !
|
||
// This file was generated automatically from 'src/generator/templates/cli/main.rs.mako'
|
||
// DO NOT EDIT !
|
||
#![allow(unused_variables, unused_imports, dead_code, unused_mut)]
|
||
|
||
#[macro_use]
|
||
extern crate clap;
|
||
|
||
use std::env;
|
||
use std::io::{self, Write};
|
||
use clap::{App, SubCommand, Arg};
|
||
|
||
use google_mirror1::{api, Error, oauth2, client::chrono, FieldMask};
|
||
|
||
|
||
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,
|
||
calltype_from_str, remove_json_null_values, ComplexType, JsonType, JsonTypeInfo};
|
||
|
||
use std::default::Default;
|
||
use std::error::Error as StdError;
|
||
use std::str::FromStr;
|
||
|
||
use serde_json as json;
|
||
use clap::ArgMatches;
|
||
use http::Uri;
|
||
use hyper::client::connect;
|
||
use tokio::io::{AsyncRead, AsyncWrite};
|
||
use tower_service;
|
||
|
||
enum DoitError {
|
||
IoError(String, io::Error),
|
||
ApiError(Error),
|
||
}
|
||
|
||
struct Engine<'n, S> {
|
||
opt: ArgMatches<'n>,
|
||
hub: api::Mirror<S>,
|
||
gp: Vec<&'static str>,
|
||
gpm: Vec<(&'static str, &'static str)>,
|
||
}
|
||
|
||
|
||
impl<'n, S> Engine<'n, S>
|
||
where
|
||
S: tower_service::Service<Uri> + Clone + Send + Sync + 'static,
|
||
S::Response: hyper::client::connect::Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static,
|
||
S::Future: Send + Unpin + 'static,
|
||
S::Error: Into<Box<dyn StdError + Send + Sync>>,
|
||
{
|
||
async fn _accounts_insert(&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()[..] {
|
||
"features" => Some(("features", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"password" => Some(("password", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
_ => {
|
||
let suggestion = FieldCursor::did_you_mean(key, &vec!["features", "password"]);
|
||
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::Account = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.accounts().insert(request, opt.value_of("user-token").unwrap_or(""), opt.value_of("account-type").unwrap_or(""), opt.value_of("account-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);
|
||
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 _contacts_delete(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.contacts().delete(opt.value_of("id").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);
|
||
}
|
||
match match protocol {
|
||
CallType::Standard => call.doit().await,
|
||
_ => unreachable!()
|
||
} {
|
||
Err(api_err) => Err(DoitError::ApiError(api_err)),
|
||
Ok(mut response) => {
|
||
Ok(())
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
async fn _contacts_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.contacts().get(opt.value_of("id").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 _contacts_insert(&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()[..] {
|
||
"accept-types" => Some(("acceptTypes", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"display-name" => Some(("displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"image-urls" => Some(("imageUrls", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"phone-number" => Some(("phoneNumber", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"priority" => Some(("priority", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"sharing-features" => Some(("sharingFeatures", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"source" => Some(("source", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-name" => Some(("speakableName", 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!["accept-types", "display-name", "id", "image-urls", "kind", "phone-number", "priority", "sharing-features", "source", "speakable-name", "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::Contact = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.contacts().insert(request);
|
||
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 _contacts_list(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.contacts().list();
|
||
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 _contacts_patch(&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()[..] {
|
||
"accept-types" => Some(("acceptTypes", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"display-name" => Some(("displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"image-urls" => Some(("imageUrls", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"phone-number" => Some(("phoneNumber", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"priority" => Some(("priority", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"sharing-features" => Some(("sharingFeatures", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"source" => Some(("source", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-name" => Some(("speakableName", 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!["accept-types", "display-name", "id", "image-urls", "kind", "phone-number", "priority", "sharing-features", "source", "speakable-name", "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::Contact = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.contacts().patch(request, opt.value_of("id").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 _contacts_update(&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()[..] {
|
||
"accept-types" => Some(("acceptTypes", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"display-name" => Some(("displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"image-urls" => Some(("imageUrls", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"phone-number" => Some(("phoneNumber", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"priority" => Some(("priority", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"sharing-features" => Some(("sharingFeatures", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"source" => Some(("source", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-name" => Some(("speakableName", 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!["accept-types", "display-name", "id", "image-urls", "kind", "phone-number", "priority", "sharing-features", "source", "speakable-name", "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::Contact = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.contacts().update(request, opt.value_of("id").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 _locations_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.locations().get(opt.value_of("id").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 _locations_list(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.locations().list();
|
||
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 _settings_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.settings().get(opt.value_of("id").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 _subscriptions_delete(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.subscriptions().delete(opt.value_of("id").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);
|
||
}
|
||
match match protocol {
|
||
CallType::Standard => call.doit().await,
|
||
_ => unreachable!()
|
||
} {
|
||
Err(api_err) => Err(DoitError::ApiError(api_err)),
|
||
Ok(mut response) => {
|
||
Ok(())
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
async fn _subscriptions_insert(&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()[..] {
|
||
"callback-url" => Some(("callbackUrl", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"collection" => Some(("collection", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.collection" => Some(("notification.collection", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.item-id" => Some(("notification.itemId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.operation" => Some(("notification.operation", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.user-token" => Some(("notification.userToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.verify-token" => Some(("notification.verifyToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"operation" => Some(("operation", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"updated" => Some(("updated", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"user-token" => Some(("userToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"verify-token" => Some(("verifyToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
_ => {
|
||
let suggestion = FieldCursor::did_you_mean(key, &vec!["callback-url", "collection", "id", "item-id", "kind", "notification", "operation", "updated", "user-token", "verify-token"]);
|
||
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::Subscription = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.subscriptions().insert(request);
|
||
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 _subscriptions_list(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.subscriptions().list();
|
||
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 _subscriptions_update(&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()[..] {
|
||
"callback-url" => Some(("callbackUrl", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"collection" => Some(("collection", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.collection" => Some(("notification.collection", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.item-id" => Some(("notification.itemId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.operation" => Some(("notification.operation", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.user-token" => Some(("notification.userToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.verify-token" => Some(("notification.verifyToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"operation" => Some(("operation", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"updated" => Some(("updated", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"user-token" => Some(("userToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"verify-token" => Some(("verifyToken", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
_ => {
|
||
let suggestion = FieldCursor::did_you_mean(key, &vec!["callback-url", "collection", "id", "item-id", "kind", "notification", "operation", "updated", "user-token", "verify-token"]);
|
||
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::Subscription = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.subscriptions().update(request, opt.value_of("id").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 _timeline_attachments_delete(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.timeline().attachments_delete(opt.value_of("item-id").unwrap_or(""), opt.value_of("attachment-id").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);
|
||
}
|
||
match match protocol {
|
||
CallType::Standard => call.doit().await,
|
||
_ => unreachable!()
|
||
} {
|
||
Err(api_err) => Err(DoitError::ApiError(api_err)),
|
||
Ok(mut response) => {
|
||
Ok(())
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
async fn _timeline_attachments_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut download_mode = false;
|
||
let mut call = self.hub.timeline().attachments_get(opt.value_of("item-id").unwrap_or(""), opt.value_of("attachment-id").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 {
|
||
if key == "alt" && value.unwrap_or("unset") == "media" {
|
||
download_mode = true;
|
||
}
|
||
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)) => {
|
||
if !download_mode {
|
||
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();
|
||
} else {
|
||
let bytes = hyper::body::to_bytes(response.into_body()).await.expect("a string as API currently is inefficient").to_vec();
|
||
ostream.write_all(&bytes).expect("write to be complete");
|
||
ostream.flush().expect("io to never fail which should really be fixed one day");
|
||
}
|
||
Ok(())
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
async fn _timeline_attachments_insert(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.timeline().attachments_insert(opt.value_of("item-id").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 vals = opt.values_of("mode").unwrap().collect::<Vec<&str>>();
|
||
let protocol = calltype_from_str(vals[0], ["simple"].iter().map(|&v| v.to_string()).collect(), err);
|
||
let mut input_file = input_file_from_opts(vals[1], err);
|
||
let mime_type = input_mime_from_opts(opt.value_of("mime").unwrap_or("application/octet-stream"), err);
|
||
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::Upload(UploadProtocol::Simple) => call.upload(input_file.unwrap(), mime_type.unwrap()).await,
|
||
CallType::Standard => 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 _timeline_attachments_list(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.timeline().attachments_list(opt.value_of("item-id").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 _timeline_delete(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.timeline().delete(opt.value_of("id").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);
|
||
}
|
||
match match protocol {
|
||
CallType::Standard => call.doit().await,
|
||
_ => unreachable!()
|
||
} {
|
||
Err(api_err) => Err(DoitError::ApiError(api_err)),
|
||
Ok(mut response) => {
|
||
Ok(())
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
async fn _timeline_get(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.timeline().get(opt.value_of("id").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 _timeline_insert(&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()[..] {
|
||
"bundle-id" => Some(("bundleId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"canonical-url" => Some(("canonicalUrl", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"created" => Some(("created", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.accept-types" => Some(("creator.acceptTypes", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.display-name" => Some(("creator.displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.id" => Some(("creator.id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.image-urls" => Some(("creator.imageUrls", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.kind" => Some(("creator.kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.phone-number" => Some(("creator.phoneNumber", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.priority" => Some(("creator.priority", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"creator.sharing-features" => Some(("creator.sharingFeatures", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.source" => Some(("creator.source", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.speakable-name" => Some(("creator.speakableName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.type" => Some(("creator.type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"display-time" => Some(("displayTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"etag" => Some(("etag", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"html" => Some(("html", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"in-reply-to" => Some(("inReplyTo", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"is-bundle-cover" => Some(("isBundleCover", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"is-deleted" => Some(("isDeleted", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"is-pinned" => Some(("isPinned", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.accuracy" => Some(("location.accuracy", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.address" => Some(("location.address", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.display-name" => Some(("location.displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.id" => Some(("location.id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.kind" => Some(("location.kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.latitude" => Some(("location.latitude", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.longitude" => Some(("location.longitude", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.timestamp" => Some(("location.timestamp", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.delivery-time" => Some(("notification.deliveryTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.level" => Some(("notification.level", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"pin-score" => Some(("pinScore", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"self-link" => Some(("selfLink", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"source-item-id" => Some(("sourceItemId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-text" => Some(("speakableText", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-type" => Some(("speakableType", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"text" => Some(("text", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"title" => Some(("title", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"updated" => Some(("updated", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
_ => {
|
||
let suggestion = FieldCursor::did_you_mean(key, &vec!["accept-types", "accuracy", "address", "bundle-id", "canonical-url", "created", "creator", "delivery-time", "display-name", "display-time", "etag", "html", "id", "image-urls", "in-reply-to", "is-bundle-cover", "is-deleted", "is-pinned", "kind", "latitude", "level", "location", "longitude", "notification", "phone-number", "pin-score", "priority", "self-link", "sharing-features", "source", "source-item-id", "speakable-name", "speakable-text", "speakable-type", "text", "timestamp", "title", "type", "updated"]);
|
||
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::TimelineItem = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.timeline().insert(request);
|
||
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 vals = opt.values_of("mode").unwrap().collect::<Vec<&str>>();
|
||
let protocol = calltype_from_str(vals[0], ["simple"].iter().map(|&v| v.to_string()).collect(), err);
|
||
let mut input_file = input_file_from_opts(vals[1], err);
|
||
let mime_type = input_mime_from_opts(opt.value_of("mime").unwrap_or("application/octet-stream"), err);
|
||
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::Upload(UploadProtocol::Simple) => call.upload(input_file.unwrap(), mime_type.unwrap()).await,
|
||
CallType::Standard => 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 _timeline_list(&self, opt: &ArgMatches<'n>, dry_run: bool, err: &mut InvalidOptionsError)
|
||
-> Result<(), DoitError> {
|
||
let mut call = self.hub.timeline().list();
|
||
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 {
|
||
"source-item-id" => {
|
||
call = call.source_item_id(value.unwrap_or(""));
|
||
},
|
||
"pinned-only" => {
|
||
call = call.pinned_only( value.map(|v| arg_from_str(v, err, "pinned-only", "boolean")).unwrap_or(false));
|
||
},
|
||
"page-token" => {
|
||
call = call.page_token(value.unwrap_or(""));
|
||
},
|
||
"order-by" => {
|
||
call = call.order_by(value.unwrap_or(""));
|
||
},
|
||
"max-results" => {
|
||
call = call.max_results( value.map(|v| arg_from_str(v, err, "max-results", "uint32")).unwrap_or(0));
|
||
},
|
||
"include-deleted" => {
|
||
call = call.include_deleted( value.map(|v| arg_from_str(v, err, "include-deleted", "boolean")).unwrap_or(false));
|
||
},
|
||
"bundle-id" => {
|
||
call = call.bundle_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(["bundle-id", "include-deleted", "max-results", "order-by", "page-token", "pinned-only", "source-item-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 _timeline_patch(&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()[..] {
|
||
"bundle-id" => Some(("bundleId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"canonical-url" => Some(("canonicalUrl", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"created" => Some(("created", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.accept-types" => Some(("creator.acceptTypes", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.display-name" => Some(("creator.displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.id" => Some(("creator.id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.image-urls" => Some(("creator.imageUrls", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.kind" => Some(("creator.kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.phone-number" => Some(("creator.phoneNumber", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.priority" => Some(("creator.priority", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"creator.sharing-features" => Some(("creator.sharingFeatures", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.source" => Some(("creator.source", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.speakable-name" => Some(("creator.speakableName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.type" => Some(("creator.type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"display-time" => Some(("displayTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"etag" => Some(("etag", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"html" => Some(("html", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"in-reply-to" => Some(("inReplyTo", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"is-bundle-cover" => Some(("isBundleCover", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"is-deleted" => Some(("isDeleted", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"is-pinned" => Some(("isPinned", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.accuracy" => Some(("location.accuracy", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.address" => Some(("location.address", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.display-name" => Some(("location.displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.id" => Some(("location.id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.kind" => Some(("location.kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.latitude" => Some(("location.latitude", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.longitude" => Some(("location.longitude", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.timestamp" => Some(("location.timestamp", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.delivery-time" => Some(("notification.deliveryTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.level" => Some(("notification.level", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"pin-score" => Some(("pinScore", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"self-link" => Some(("selfLink", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"source-item-id" => Some(("sourceItemId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-text" => Some(("speakableText", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-type" => Some(("speakableType", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"text" => Some(("text", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"title" => Some(("title", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"updated" => Some(("updated", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
_ => {
|
||
let suggestion = FieldCursor::did_you_mean(key, &vec!["accept-types", "accuracy", "address", "bundle-id", "canonical-url", "created", "creator", "delivery-time", "display-name", "display-time", "etag", "html", "id", "image-urls", "in-reply-to", "is-bundle-cover", "is-deleted", "is-pinned", "kind", "latitude", "level", "location", "longitude", "notification", "phone-number", "pin-score", "priority", "self-link", "sharing-features", "source", "source-item-id", "speakable-name", "speakable-text", "speakable-type", "text", "timestamp", "title", "type", "updated"]);
|
||
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::TimelineItem = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.timeline().patch(request, opt.value_of("id").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 _timeline_update(&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()[..] {
|
||
"bundle-id" => Some(("bundleId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"canonical-url" => Some(("canonicalUrl", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"created" => Some(("created", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.accept-types" => Some(("creator.acceptTypes", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.display-name" => Some(("creator.displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.id" => Some(("creator.id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.image-urls" => Some(("creator.imageUrls", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.kind" => Some(("creator.kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.phone-number" => Some(("creator.phoneNumber", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.priority" => Some(("creator.priority", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"creator.sharing-features" => Some(("creator.sharingFeatures", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Vec })),
|
||
"creator.source" => Some(("creator.source", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.speakable-name" => Some(("creator.speakableName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"creator.type" => Some(("creator.type", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"display-time" => Some(("displayTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"etag" => Some(("etag", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"html" => Some(("html", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"id" => Some(("id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"in-reply-to" => Some(("inReplyTo", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"is-bundle-cover" => Some(("isBundleCover", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"is-deleted" => Some(("isDeleted", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"is-pinned" => Some(("isPinned", JsonTypeInfo { jtype: JsonType::Boolean, ctype: ComplexType::Pod })),
|
||
"kind" => Some(("kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.accuracy" => Some(("location.accuracy", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.address" => Some(("location.address", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.display-name" => Some(("location.displayName", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.id" => Some(("location.id", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.kind" => Some(("location.kind", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"location.latitude" => Some(("location.latitude", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.longitude" => Some(("location.longitude", JsonTypeInfo { jtype: JsonType::Float, ctype: ComplexType::Pod })),
|
||
"location.timestamp" => Some(("location.timestamp", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.delivery-time" => Some(("notification.deliveryTime", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"notification.level" => Some(("notification.level", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"pin-score" => Some(("pinScore", JsonTypeInfo { jtype: JsonType::Int, ctype: ComplexType::Pod })),
|
||
"self-link" => Some(("selfLink", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"source-item-id" => Some(("sourceItemId", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-text" => Some(("speakableText", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"speakable-type" => Some(("speakableType", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"text" => Some(("text", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"title" => Some(("title", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
"updated" => Some(("updated", JsonTypeInfo { jtype: JsonType::String, ctype: ComplexType::Pod })),
|
||
_ => {
|
||
let suggestion = FieldCursor::did_you_mean(key, &vec!["accept-types", "accuracy", "address", "bundle-id", "canonical-url", "created", "creator", "delivery-time", "display-name", "display-time", "etag", "html", "id", "image-urls", "in-reply-to", "is-bundle-cover", "is-deleted", "is-pinned", "kind", "latitude", "level", "location", "longitude", "notification", "phone-number", "pin-score", "priority", "self-link", "sharing-features", "source", "source-item-id", "speakable-name", "speakable-text", "speakable-type", "text", "timestamp", "title", "type", "updated"]);
|
||
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::TimelineItem = json::value::from_value(object).unwrap();
|
||
let mut call = self.hub.timeline().update(request, opt.value_of("id").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 vals = opt.values_of("mode").unwrap().collect::<Vec<&str>>();
|
||
let protocol = calltype_from_str(vals[0], ["simple"].iter().map(|&v| v.to_string()).collect(), err);
|
||
let mut input_file = input_file_from_opts(vals[1], err);
|
||
let mime_type = input_mime_from_opts(opt.value_of("mime").unwrap_or("application/octet-stream"), err);
|
||
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::Upload(UploadProtocol::Simple) => call.upload(input_file.unwrap(), mime_type.unwrap()).await,
|
||
CallType::Standard => 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 _doit(&self, dry_run: bool) -> Result<Result<(), DoitError>, Option<InvalidOptionsError>> {
|
||
let mut err = InvalidOptionsError::new();
|
||
let mut call_result: Result<(), DoitError> = Ok(());
|
||
let mut err_opt: Option<InvalidOptionsError> = None;
|
||
match self.opt.subcommand() {
|
||
("accounts", Some(opt)) => {
|
||
match opt.subcommand() {
|
||
("insert", Some(opt)) => {
|
||
call_result = self._accounts_insert(opt, dry_run, &mut err).await;
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingMethodError("accounts".to_string()));
|
||
writeln!(io::stderr(), "{}\n", opt.usage()).ok();
|
||
}
|
||
}
|
||
},
|
||
("contacts", Some(opt)) => {
|
||
match opt.subcommand() {
|
||
("delete", Some(opt)) => {
|
||
call_result = self._contacts_delete(opt, dry_run, &mut err).await;
|
||
},
|
||
("get", Some(opt)) => {
|
||
call_result = self._contacts_get(opt, dry_run, &mut err).await;
|
||
},
|
||
("insert", Some(opt)) => {
|
||
call_result = self._contacts_insert(opt, dry_run, &mut err).await;
|
||
},
|
||
("list", Some(opt)) => {
|
||
call_result = self._contacts_list(opt, dry_run, &mut err).await;
|
||
},
|
||
("patch", Some(opt)) => {
|
||
call_result = self._contacts_patch(opt, dry_run, &mut err).await;
|
||
},
|
||
("update", Some(opt)) => {
|
||
call_result = self._contacts_update(opt, dry_run, &mut err).await;
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingMethodError("contacts".to_string()));
|
||
writeln!(io::stderr(), "{}\n", opt.usage()).ok();
|
||
}
|
||
}
|
||
},
|
||
("locations", Some(opt)) => {
|
||
match opt.subcommand() {
|
||
("get", Some(opt)) => {
|
||
call_result = self._locations_get(opt, dry_run, &mut err).await;
|
||
},
|
||
("list", Some(opt)) => {
|
||
call_result = self._locations_list(opt, dry_run, &mut err).await;
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingMethodError("locations".to_string()));
|
||
writeln!(io::stderr(), "{}\n", opt.usage()).ok();
|
||
}
|
||
}
|
||
},
|
||
("settings", Some(opt)) => {
|
||
match opt.subcommand() {
|
||
("get", Some(opt)) => {
|
||
call_result = self._settings_get(opt, dry_run, &mut err).await;
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingMethodError("settings".to_string()));
|
||
writeln!(io::stderr(), "{}\n", opt.usage()).ok();
|
||
}
|
||
}
|
||
},
|
||
("subscriptions", Some(opt)) => {
|
||
match opt.subcommand() {
|
||
("delete", Some(opt)) => {
|
||
call_result = self._subscriptions_delete(opt, dry_run, &mut err).await;
|
||
},
|
||
("insert", Some(opt)) => {
|
||
call_result = self._subscriptions_insert(opt, dry_run, &mut err).await;
|
||
},
|
||
("list", Some(opt)) => {
|
||
call_result = self._subscriptions_list(opt, dry_run, &mut err).await;
|
||
},
|
||
("update", Some(opt)) => {
|
||
call_result = self._subscriptions_update(opt, dry_run, &mut err).await;
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingMethodError("subscriptions".to_string()));
|
||
writeln!(io::stderr(), "{}\n", opt.usage()).ok();
|
||
}
|
||
}
|
||
},
|
||
("timeline", Some(opt)) => {
|
||
match opt.subcommand() {
|
||
("attachments-delete", Some(opt)) => {
|
||
call_result = self._timeline_attachments_delete(opt, dry_run, &mut err).await;
|
||
},
|
||
("attachments-get", Some(opt)) => {
|
||
call_result = self._timeline_attachments_get(opt, dry_run, &mut err).await;
|
||
},
|
||
("attachments-insert", Some(opt)) => {
|
||
call_result = self._timeline_attachments_insert(opt, dry_run, &mut err).await;
|
||
},
|
||
("attachments-list", Some(opt)) => {
|
||
call_result = self._timeline_attachments_list(opt, dry_run, &mut err).await;
|
||
},
|
||
("delete", Some(opt)) => {
|
||
call_result = self._timeline_delete(opt, dry_run, &mut err).await;
|
||
},
|
||
("get", Some(opt)) => {
|
||
call_result = self._timeline_get(opt, dry_run, &mut err).await;
|
||
},
|
||
("insert", Some(opt)) => {
|
||
call_result = self._timeline_insert(opt, dry_run, &mut err).await;
|
||
},
|
||
("list", Some(opt)) => {
|
||
call_result = self._timeline_list(opt, dry_run, &mut err).await;
|
||
},
|
||
("patch", Some(opt)) => {
|
||
call_result = self._timeline_patch(opt, dry_run, &mut err).await;
|
||
},
|
||
("update", Some(opt)) => {
|
||
call_result = self._timeline_update(opt, dry_run, &mut err).await;
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingMethodError("timeline".to_string()));
|
||
writeln!(io::stderr(), "{}\n", opt.usage()).ok();
|
||
}
|
||
}
|
||
},
|
||
_ => {
|
||
err.issues.push(CLIError::MissingCommandError);
|
||
writeln!(io::stderr(), "{}\n", self.opt.usage()).ok();
|
||
}
|
||
}
|
||
|
||
if dry_run {
|
||
if err.issues.len() > 0 {
|
||
err_opt = Some(err);
|
||
}
|
||
Err(err_opt)
|
||
} else {
|
||
Ok(call_result)
|
||
}
|
||
}
|
||
|
||
// Please note that this call will fail if any part of the opt can't be handled
|
||
async fn new(opt: ArgMatches<'n>, connector: S) -> Result<Engine<'n, S>, InvalidOptionsError> {
|
||
let (config_dir, secret) = {
|
||
let config_dir = match client::assure_config_dir_exists(opt.value_of("folder").unwrap_or("~/.google-service-cli")) {
|
||
Err(e) => return Err(InvalidOptionsError::single(e, 3)),
|
||
Ok(p) => p,
|
||
};
|
||
|
||
match client::application_secret_from_directory(&config_dir, "mirror1-secret.json",
|
||
"{\"installed\":{\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"client_secret\":\"hCsslbCUyfehWMmbkG8vTYxG\",\"token_uri\":\"https://accounts.google.com/o/oauth2/token\",\"client_email\":\"\",\"redirect_uris\":[\"urn:ietf:wg:oauth:2.0:oob\",\"oob\"],\"client_x509_cert_url\":\"\",\"client_id\":\"620010449518-9ngf7o4dhs0dka470npqvor6dc5lqb9b.apps.googleusercontent.com\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\"}}") {
|
||
Ok(secret) => (config_dir, secret),
|
||
Err(e) => return Err(InvalidOptionsError::single(e, 4))
|
||
}
|
||
};
|
||
|
||
let client = hyper::Client::builder().build(connector);
|
||
|
||
let auth = oauth2::InstalledFlowAuthenticator::with_client(
|
||
secret,
|
||
oauth2::InstalledFlowReturnMethod::HTTPRedirect,
|
||
client.clone(),
|
||
).persist_tokens_to_disk(format!("{}/mirror1", config_dir)).build().await.unwrap();
|
||
|
||
let engine = Engine {
|
||
opt: opt,
|
||
hub: api::Mirror::new(client, auth),
|
||
gp: vec!["alt", "fields", "key", "oauth-token", "pretty-print", "quota-user", "user-ip"],
|
||
gpm: vec![
|
||
("oauth-token", "oauth_token"),
|
||
("pretty-print", "prettyPrint"),
|
||
("quota-user", "quotaUser"),
|
||
("user-ip", "userIp"),
|
||
]
|
||
};
|
||
|
||
match engine._doit(true).await {
|
||
Err(Some(err)) => Err(err),
|
||
Err(None) => Ok(engine),
|
||
Ok(_) => unreachable!(),
|
||
}
|
||
}
|
||
|
||
async fn doit(&self) -> Result<(), DoitError> {
|
||
match self._doit(false).await {
|
||
Ok(res) => res,
|
||
Err(_) => unreachable!(),
|
||
}
|
||
}
|
||
}
|
||
|
||
#[tokio::main]
|
||
async fn main() {
|
||
let mut exit_status = 0i32;
|
||
let upload_value_names = ["mode", "file"];
|
||
let arg_data = [
|
||
("accounts", "methods: 'insert'", vec![
|
||
("insert",
|
||
Some(r##"Inserts a new account for a user"##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/accounts_insert",
|
||
vec![
|
||
(Some(r##"user-token"##),
|
||
None,
|
||
Some(r##"The ID for the user."##),
|
||
Some(true),
|
||
Some(false)),
|
||
|
||
(Some(r##"account-type"##),
|
||
None,
|
||
Some(r##"Account type to be passed to Android Account Manager."##),
|
||
Some(true),
|
||
Some(false)),
|
||
|
||
(Some(r##"account-name"##),
|
||
None,
|
||
Some(r##"The name of the account to be passed to the Android Account Manager."##),
|
||
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)),
|
||
]),
|
||
]),
|
||
|
||
("contacts", "methods: 'delete', 'get', 'insert', 'list', 'patch' and 'update'", vec![
|
||
("delete",
|
||
Some(r##"Deletes a contact."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/contacts_delete",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the contact."##),
|
||
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)),
|
||
]),
|
||
("get",
|
||
Some(r##"Gets a single contact by ID."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/contacts_get",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the contact."##),
|
||
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)),
|
||
]),
|
||
("insert",
|
||
Some(r##"Inserts a new contact."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/contacts_insert",
|
||
vec![
|
||
(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)),
|
||
]),
|
||
("list",
|
||
Some(r##"Retrieves a list of contacts for the authenticated user."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/contacts_list",
|
||
vec![
|
||
(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)),
|
||
]),
|
||
("patch",
|
||
Some(r##"Updates a contact in place. This method supports patch semantics."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/contacts_patch",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the contact."##),
|
||
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)),
|
||
]),
|
||
("update",
|
||
Some(r##"Updates a contact in place."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/contacts_update",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the contact."##),
|
||
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)),
|
||
]),
|
||
]),
|
||
|
||
("locations", "methods: 'get' and 'list'", vec![
|
||
("get",
|
||
Some(r##"Gets a single location by ID."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/locations_get",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the location or latest for the last known location."##),
|
||
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)),
|
||
]),
|
||
("list",
|
||
Some(r##"Retrieves a list of locations for the user."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/locations_list",
|
||
vec![
|
||
(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)),
|
||
]),
|
||
]),
|
||
|
||
("settings", "methods: 'get'", vec![
|
||
("get",
|
||
Some(r##"Gets a single setting by ID."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/settings_get",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the setting. The following IDs are valid:
|
||
- locale - The key to the user’s language/locale (BCP 47 identifier) that Glassware should use to render localized content.
|
||
- timezone - The key to the user’s current time zone region as defined in the tz database. Example: America/Los_Angeles."##),
|
||
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)),
|
||
]),
|
||
]),
|
||
|
||
("subscriptions", "methods: 'delete', 'insert', 'list' and 'update'", vec![
|
||
("delete",
|
||
Some(r##"Deletes a subscription."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/subscriptions_delete",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the subscription."##),
|
||
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)),
|
||
]),
|
||
("insert",
|
||
Some(r##"Creates a new subscription."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/subscriptions_insert",
|
||
vec![
|
||
(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)),
|
||
]),
|
||
("list",
|
||
Some(r##"Retrieves a list of subscriptions for the authenticated user and service."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/subscriptions_list",
|
||
vec![
|
||
(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)),
|
||
]),
|
||
("update",
|
||
Some(r##"Updates an existing subscription in place."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/subscriptions_update",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the subscription."##),
|
||
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)),
|
||
]),
|
||
]),
|
||
|
||
("timeline", "methods: 'attachments-delete', 'attachments-get', 'attachments-insert', 'attachments-list', 'delete', 'get', 'insert', 'list', 'patch' and 'update'", vec![
|
||
("attachments-delete",
|
||
Some(r##"Deletes an attachment from a timeline item."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_attachments-delete",
|
||
vec![
|
||
(Some(r##"item-id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item the attachment belongs to."##),
|
||
Some(true),
|
||
Some(false)),
|
||
|
||
(Some(r##"attachment-id"##),
|
||
None,
|
||
Some(r##"The ID of the attachment."##),
|
||
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)),
|
||
]),
|
||
("attachments-get",
|
||
Some(r##"Retrieves an attachment on a timeline item by item ID and attachment ID."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_attachments-get",
|
||
vec![
|
||
(Some(r##"item-id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item the attachment belongs to."##),
|
||
Some(true),
|
||
Some(false)),
|
||
|
||
(Some(r##"attachment-id"##),
|
||
None,
|
||
Some(r##"The ID of the attachment."##),
|
||
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)),
|
||
]),
|
||
("attachments-insert",
|
||
Some(r##"Adds a new attachment to a timeline item."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_attachments-insert",
|
||
vec![
|
||
(Some(r##"item-id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item the attachment belongs to."##),
|
||
Some(true),
|
||
Some(false)),
|
||
|
||
(Some(r##"mode"##),
|
||
Some(r##"u"##),
|
||
Some(r##"Specify the upload protocol (simple) and the file to upload"##),
|
||
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)),
|
||
]),
|
||
("attachments-list",
|
||
Some(r##"Returns a list of attachments for a timeline item."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_attachments-list",
|
||
vec![
|
||
(Some(r##"item-id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item whose attachments should be listed."##),
|
||
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)),
|
||
]),
|
||
("delete",
|
||
Some(r##"Deletes a timeline item."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_delete",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item."##),
|
||
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)),
|
||
]),
|
||
("get",
|
||
Some(r##"Gets a single timeline item by ID."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_get",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item."##),
|
||
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)),
|
||
]),
|
||
("insert",
|
||
Some(r##"Inserts a new item into the timeline."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_insert",
|
||
vec![
|
||
(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##"mode"##),
|
||
Some(r##"u"##),
|
||
Some(r##"Specify the upload protocol (simple) and the file to upload"##),
|
||
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)),
|
||
]),
|
||
("list",
|
||
Some(r##"Retrieves a list of timeline items for the authenticated user."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_list",
|
||
vec![
|
||
(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)),
|
||
]),
|
||
("patch",
|
||
Some(r##"Updates a timeline item in place. This method supports patch semantics."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_patch",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item."##),
|
||
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)),
|
||
]),
|
||
("update",
|
||
Some(r##"Updates a timeline item in place."##),
|
||
"Details at http://byron.github.io/google-apis-rs/google_mirror1_cli/timeline_update",
|
||
vec![
|
||
(Some(r##"id"##),
|
||
None,
|
||
Some(r##"The ID of the timeline item."##),
|
||
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##"mode"##),
|
||
Some(r##"u"##),
|
||
Some(r##"Specify the upload protocol (simple) and the file to upload"##),
|
||
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)),
|
||
]),
|
||
]),
|
||
|
||
];
|
||
|
||
let mut app = App::new("mirror1")
|
||
.author("Sebastian Thiel <byronimo@gmail.com>")
|
||
.version("5.0.2+20190424")
|
||
.about("Interacts with Glass users via the timeline.")
|
||
.after_help("All documentation details can be found at http://byron.github.io/google-apis-rs/google_mirror1_cli")
|
||
.arg(Arg::with_name("url")
|
||
.long("scope")
|
||
.help("Specify the authentication a method should be executed in. Each scope requires the user to grant this application permission to use it.If unset, it defaults to the shortest scope url for a particular method.")
|
||
.multiple(true)
|
||
.takes_value(true))
|
||
.arg(Arg::with_name("folder")
|
||
.long("config-dir")
|
||
.help("A directory into which we will store our persistent data. Defaults to a user-writable directory that we will create during the first invocation.[default: ~/.google-service-cli")
|
||
.multiple(false)
|
||
.takes_value(true))
|
||
.arg(Arg::with_name("debug")
|
||
.long("debug")
|
||
.help("Debug print all errors")
|
||
.multiple(false)
|
||
.takes_value(false));
|
||
|
||
for &(main_command_name, about, ref subcommands) in arg_data.iter() {
|
||
let mut mcmd = SubCommand::with_name(main_command_name).about(about);
|
||
|
||
for &(sub_command_name, ref desc, url_info, ref args) in subcommands {
|
||
let mut scmd = SubCommand::with_name(sub_command_name);
|
||
if let &Some(desc) = desc {
|
||
scmd = scmd.about(desc);
|
||
}
|
||
scmd = scmd.after_help(url_info);
|
||
|
||
for &(ref arg_name, ref flag, ref desc, ref required, ref multi) in args {
|
||
let arg_name_str =
|
||
match (arg_name, flag) {
|
||
(&Some(an), _ ) => an,
|
||
(_ , &Some(f)) => f,
|
||
_ => unreachable!(),
|
||
};
|
||
let mut arg = Arg::with_name(arg_name_str)
|
||
.empty_values(false);
|
||
if let &Some(short_flag) = flag {
|
||
arg = arg.short(short_flag);
|
||
}
|
||
if let &Some(desc) = desc {
|
||
arg = arg.help(desc);
|
||
}
|
||
if arg_name.is_some() && flag.is_some() {
|
||
arg = arg.takes_value(true);
|
||
}
|
||
if let &Some(required) = required {
|
||
arg = arg.required(required);
|
||
}
|
||
if let &Some(multi) = multi {
|
||
arg = arg.multiple(multi);
|
||
}
|
||
if arg_name_str == "mode" {
|
||
arg = arg.number_of_values(2);
|
||
arg = arg.value_names(&upload_value_names);
|
||
|
||
scmd = scmd.arg(Arg::with_name("mime")
|
||
.short("m")
|
||
.requires("mode")
|
||
.required(false)
|
||
.help("The file's mime time, like 'application/octet-stream'")
|
||
.takes_value(true));
|
||
}
|
||
scmd = scmd.arg(arg);
|
||
}
|
||
mcmd = mcmd.subcommand(scmd);
|
||
}
|
||
app = app.subcommand(mcmd);
|
||
}
|
||
|
||
let matches = app.get_matches();
|
||
|
||
let debug = matches.is_present("adebug");
|
||
let connector = hyper_rustls::HttpsConnectorBuilder::new().with_native_roots()
|
||
.https_or_http()
|
||
.enable_http1()
|
||
.enable_http2()
|
||
.build();
|
||
|
||
match Engine::new(matches, connector).await {
|
||
Err(err) => {
|
||
exit_status = err.exit_code;
|
||
writeln!(io::stderr(), "{}", err).ok();
|
||
},
|
||
Ok(engine) => {
|
||
if let Err(doit_err) = engine.doit().await {
|
||
exit_status = 1;
|
||
match doit_err {
|
||
DoitError::IoError(path, err) => {
|
||
writeln!(io::stderr(), "Failed to open output file '{}': {}", path, err).ok();
|
||
},
|
||
DoitError::ApiError(err) => {
|
||
if debug {
|
||
writeln!(io::stderr(), "{:#?}", err).ok();
|
||
} else {
|
||
writeln!(io::stderr(), "{}", err).ok();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
std::process::exit(exit_status);
|
||
}
|