fix(all): update all code to latest version

* add new APIs
* remove old ones
* add latest json files
This commit is contained in:
Sebastian Thiel
2015-04-24 20:07:12 +02:00
parent 845a568b25
commit f8689be451
650 changed files with 80776 additions and 88805 deletions

View File

@@ -4,8 +4,8 @@
[package]
name = "google-cloudsearch1-cli"
version = "0.0.1+20150309"
authors = ["Sebastian Thiel <byronimo@gmail>"]
version = "0.0.1+20150416"
authors = ["Sebastian Thiel <byronimo@gmail.com>"]
description = "A complete library to interact with cloudsearch (protocol v1)"
repository = "https://github.com/Byron/google-apis-rs/tree/master/gen/cloudsearch1-cli"
documentation = "http://byron.github.io/google-apis-rs/google_cloudsearch1_cli"
@@ -22,6 +22,7 @@ yup-oauth2 = "*"
docopt = "*"
docopt_macros = "*"
rustc-serialize = "*"
yup-hyper-mock = "*"
serde = ">= 0.3.0"
serde_macros = "*"

View File

@@ -1,4 +1,4 @@
site_name: cloudsearch v0.0.1+20150309
site_name: cloudsearch v0.0.1+20150416
site_url: http://byron.github.io/google-apis-rs/google-cloudsearch1-cli
site_description: Write integrating applications with bcore
@@ -9,12 +9,6 @@ site_dir: build_html
pages:
- ['index.md', 'Home']
- ['projects_indexes-documents-create.md', 'Projects', 'Indexes Documents Create']
- ['projects_indexes-documents-delete.md', 'Projects', 'Indexes Documents Delete']
- ['projects_indexes-documents-get.md', 'Projects', 'Indexes Documents Get']
- ['projects_indexes-documents-list.md', 'Projects', 'Indexes Documents List']
- ['projects_indexes-list.md', 'Projects', 'Indexes List']
- ['projects_indexes-search.md', 'Projects', 'Indexes Search']
theme: readthedocs

View File

@@ -93,10 +93,10 @@ impl FieldCursor {
}
}
pub fn parse_kv_arg<'a>(kv: &'a str, err: &mut InvalidOptionsError)
pub fn parse_kv_arg<'a>(kv: &'a str, err: &mut InvalidOptionsError, for_hashmap: bool)
-> (&'a str, Option<&'a str>) {
let mut add_err = || err.issues.push(CLIError::InvalidKeyValueSyntax(kv.to_string()));
match kv.rfind('=') {
let mut add_err = || err.issues.push(CLIError::InvalidKeyValueSyntax(kv.to_string(),for_hashmap));
match kv.find('=') {
None => {
add_err();
return (kv, None)
@@ -171,25 +171,52 @@ impl JsonTokenStorage {
}
impl TokenStorage for JsonTokenStorage {
// NOTE: logging might be interesting, currently we swallow all errors
fn set(&mut self, scope_hash: u64, token: Option<Token>) {
let json_token = json::encode(&token).unwrap();
let res = fs::OpenOptions::new().create(true).write(true).open(&self.path(scope_hash));
if let Ok(mut f) = res {
f.write(json_token.as_bytes()).ok();
}
}
type Error = io::Error;
fn get(&self, scope_hash: u64) -> Option<Token> {
if let Ok(mut f) = fs::File::open(&self.path(scope_hash)) {
let mut json_string = String::new();
if let Ok(_) = f.read_to_string(&mut json_string) {
if let Ok(token) = json::decode::<Token>(&json_string) {
return Some(token)
// NOTE: logging might be interesting, currently we swallow all errors
fn set(&mut self, scope_hash: u64, _: &Vec<&str>, token: Option<Token>) -> Option<io::Error> {
match token {
None => {
match fs::remove_file(self.path(scope_hash)) {
Err(err) =>
match err.kind() {
io::ErrorKind::NotFound => None,
_ => Some(err)
},
Ok(_) => None
}
}
Some(token) => {
let json_token = json::encode(&token).unwrap();
match fs::OpenOptions::new().create(true).write(true).open(&self.path(scope_hash)) {
Ok(mut f) => {
match f.write(json_token.as_bytes()) {
Ok(_) => None,
Err(io_err) => Some(io_err),
}
},
Err(io_err) => Some(io_err)
}
}
}
}
fn get(&self, scope_hash: u64, _: &Vec<&str>) -> Result<Option<Token>, io::Error> {
match fs::File::open(&self.path(scope_hash)) {
Ok(mut f) => {
let mut json_string = String::new();
match f.read_to_string(&mut json_string) {
Ok(_) => Ok(Some(json::decode::<Token>(&json_string).unwrap())),
Err(io_err) => Err(io_err),
}
},
Err(io_err) => {
match io_err.kind() {
io::ErrorKind::NotFound => Ok(None),
_ => Err(io_err)
}
}
}
None
}
}
@@ -286,7 +313,7 @@ pub enum CLIError {
Configuration(ConfigurationError),
ParseError((&'static str, &'static str, String, String)),
UnknownParameter(String),
InvalidKeyValueSyntax(String),
InvalidKeyValueSyntax(String, bool),
Input(InputError),
Field(FieldError),
}
@@ -302,9 +329,10 @@ impl fmt::Display for CLIError {
arg_name, value, type_name, err_desc),
CLIError::UnknownParameter(ref param_name)
=> writeln!(f, "Parameter '{}' is unknown.", param_name),
CLIError::InvalidKeyValueSyntax(ref kv)
=> writeln!(f, "'{}' does not match pattern <key>=<value>", kv),
CLIError::InvalidKeyValueSyntax(ref kv, is_hashmap) => {
let hashmap_info = if is_hashmap { "hashmap " } else { "" };
writeln!(f, "'{}' does not match {}pattern <key>=<value>", kv, hashmap_info)
},
}
}
}
@@ -369,7 +397,10 @@ pub fn assure_config_dir_exists(dir: &str) -> Result<String, CLIError> {
Ok(expanded_config_dir)
}
pub fn application_secret_from_directory(dir: &str, secret_basename: &str) -> Result<ApplicationSecret, CLIError> {
pub fn application_secret_from_directory(dir: &str,
secret_basename: &str,
json_app_secret: &str)
-> Result<ApplicationSecret, CLIError> {
let secret_path = Path::new(dir).join(secret_basename);
let secret_str = || secret_path.as_path().to_str().unwrap().to_string();
let secret_io_error = |io_err: io::Error| {
@@ -383,27 +414,11 @@ pub fn application_secret_from_directory(dir: &str, secret_basename: &str) -> Re
Err(mut err) => {
if err.kind() == io::ErrorKind::NotFound {
// Write our built-in one - user may adjust the written file at will
let secret = ApplicationSecret {
client_id: "14070749909-vgip2f1okm7bkvajhi9jugan6126io9v.apps.googleusercontent.com".to_string(),
client_secret: "UqkDJd5RFwnHoiG5x5Rub8SI".to_string(),
token_uri: "https://accounts.google.com/o/oauth2/token".to_string(),
auth_uri: Default::default(),
redirect_uris: Default::default(),
client_email: None,
auth_provider_x509_cert_url: None,
client_x509_cert_url: Some("https://www.googleapis.com/oauth2/v1/certs".to_string())
};
let app_secret = ConsoleApplicationSecret {
installed: Some(secret),
web: None,
};
let json_enocded_secret = json::encode(&app_secret).unwrap();
err = match fs::OpenOptions::new().create(true).write(true).open(&secret_path) {
Err(cfe) => cfe,
Ok(mut f) => {
match f.write(json_enocded_secret.as_bytes()) {
match f.write(json_app_secret.as_bytes()) {
Err(io_err) => io_err,
Ok(_) => continue,
}

View File

@@ -7,6 +7,7 @@
extern crate docopt;
extern crate yup_oauth2 as oauth2;
extern crate yup_hyper_mock as mock;
extern crate rustc_serialize;
extern crate serde;
extern crate hyper;
@@ -18,25 +19,21 @@ use std::io::{self, Write};
docopt!(Options derive Debug, "
Usage:
cloudsearch1 [options] projects indexes-documents-create <project-id> <index-id> -r <kv>... [-p <v>]... [-o <out>]
cloudsearch1 [options] projects indexes-documents-delete <project-id> <index-id> <doc-id> [-p <v>]... [-o <out>]
cloudsearch1 [options] projects indexes-documents-get <project-id> <index-id> <doc-id> [-p <v>]... [-o <out>]
cloudsearch1 [options] projects indexes-documents-list <project-id> <index-id> <page-size> <page-token> <view> [-p <v>]... [-o <out>]
cloudsearch1 [options] projects indexes-list <project-id> <index-name-prefix> <page-size> <page-token> <view> [-p <v>]... [-o <out>]
cloudsearch1 [options] projects indexes-search <project-id> <index-id> <query> <field-expressions> <page-size> <page-token> <offset> <matched-count-accuracy> <order-by> <scorer> <scorer-size> <return-fields> [-p <v>]... [-o <out>]
cloudsearch1 --help
All documentation details can be found TODO: <URL to github.io docs here, see #51>
Configuration:
--scope <url>
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.
--config-dir <folder>
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]
--debug
Output all server communication to standard error. `tx` and `rx` are placed into
the same stream.
--debug-auth
Output all communication related to authentication to standard error. `tx` and `rx` are placed into
the same stream.
");
mod cmn;
@@ -56,353 +53,11 @@ struct Engine {
impl Engine {
fn _projects_indexes_documents_create(&self, dry_run: bool, err: &mut InvalidOptionsError)
-> Option<api::Error> {
let mut request: api::Document = Default::default();
let mut call = self.hub.projects().indexes_documents_create(&request, &self.opt.arg_project_id, &self.opt.arg_index_id);
for parg in self.opt.arg_v.iter() {
let (key, value) = parse_kv_arg(&*parg, err);
match key {
"$-xgafv"
|"access-token"
|"alt"
|"bearer-token"
|"callback"
|"fields"
|"key"
|"oauth-token"
|"pp"
|"pretty-print"
|"quota-user" => {
let map = [
("$-xgafv", "$.xgafv"),
("access-token", "access_token"),
("bearer-token", "bearer_token"),
("oauth-token", "oauth_token"),
("pretty-print", "prettyPrint"),
("quota-user", "quotaUser"),
];
call = call.param(map.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"))
},
_ => err.issues.push(CLIError::UnknownParameter(key.to_string())),
}
}
let mut field_name: FieldCursor = Default::default();
for kvarg in self.opt.arg_kv.iter() {
let (key, value) = parse_kv_arg(&*kvarg, err);
if let Err(field_err) = field_name.set(&*key) {
err.issues.push(field_err);
}
match &field_name.to_string()[..] {
"doc-id" => {
request.doc_id = Some(value.unwrap_or("").to_string());
},
"rank" => {
request.rank = Some(arg_from_str(value.unwrap_or("-0"), err, "rank", "integer"));
},
_ => {
err.issues.push(CLIError::Field(FieldError::Unknown(field_name.to_string())));
}
}
}
let protocol = "standard-request";
if dry_run {
None
} else {
assert!(err.issues.len() == 0);
let mut ostream = writer_from_opts(self.opt.flag_o, &self.opt.arg_out);
match match protocol {
"standard-request" => call.doit(),
_ => unreachable!(),
} {
Err(api_err) => Some(api_err),
Ok((mut response, output_schema)) => {
println!("DEBUG: REMOVE ME {:?}", response);
serde::json::to_writer(&mut ostream, &output_schema).unwrap();
None
}
}
}
}
fn _projects_indexes_documents_delete(&self, dry_run: bool, err: &mut InvalidOptionsError)
-> Option<api::Error> {
let mut call = self.hub.projects().indexes_documents_delete(&self.opt.arg_project_id, &self.opt.arg_index_id, &self.opt.arg_doc_id);
for parg in self.opt.arg_v.iter() {
let (key, value) = parse_kv_arg(&*parg, err);
match key {
"$-xgafv"
|"access-token"
|"alt"
|"bearer-token"
|"callback"
|"fields"
|"key"
|"oauth-token"
|"pp"
|"pretty-print"
|"quota-user" => {
let map = [
("$-xgafv", "$.xgafv"),
("access-token", "access_token"),
("bearer-token", "bearer_token"),
("oauth-token", "oauth_token"),
("pretty-print", "prettyPrint"),
("quota-user", "quotaUser"),
];
call = call.param(map.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"))
},
_ => err.issues.push(CLIError::UnknownParameter(key.to_string())),
}
}
let protocol = "standard-request";
if dry_run {
None
} else {
assert!(err.issues.len() == 0);
let mut ostream = writer_from_opts(self.opt.flag_o, &self.opt.arg_out);
match match protocol {
"standard-request" => call.doit(),
_ => unreachable!(),
} {
Err(api_err) => Some(api_err),
Ok((mut response, output_schema)) => {
println!("DEBUG: REMOVE ME {:?}", response);
serde::json::to_writer(&mut ostream, &output_schema).unwrap();
None
}
}
}
}
fn _projects_indexes_documents_get(&self, dry_run: bool, err: &mut InvalidOptionsError)
-> Option<api::Error> {
let mut call = self.hub.projects().indexes_documents_get(&self.opt.arg_project_id, &self.opt.arg_index_id, &self.opt.arg_doc_id);
for parg in self.opt.arg_v.iter() {
let (key, value) = parse_kv_arg(&*parg, err);
match key {
"$-xgafv"
|"access-token"
|"alt"
|"bearer-token"
|"callback"
|"fields"
|"key"
|"oauth-token"
|"pp"
|"pretty-print"
|"quota-user" => {
let map = [
("$-xgafv", "$.xgafv"),
("access-token", "access_token"),
("bearer-token", "bearer_token"),
("oauth-token", "oauth_token"),
("pretty-print", "prettyPrint"),
("quota-user", "quotaUser"),
];
call = call.param(map.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"))
},
_ => err.issues.push(CLIError::UnknownParameter(key.to_string())),
}
}
let protocol = "standard-request";
if dry_run {
None
} else {
assert!(err.issues.len() == 0);
let mut ostream = writer_from_opts(self.opt.flag_o, &self.opt.arg_out);
match match protocol {
"standard-request" => call.doit(),
_ => unreachable!(),
} {
Err(api_err) => Some(api_err),
Ok((mut response, output_schema)) => {
println!("DEBUG: REMOVE ME {:?}", response);
serde::json::to_writer(&mut ostream, &output_schema).unwrap();
None
}
}
}
}
fn _projects_indexes_documents_list(&self, dry_run: bool, err: &mut InvalidOptionsError)
-> Option<api::Error> {
let page_size: i32 = arg_from_str(&self.opt.arg_page_size, err, "<page-size>", "integer");
let mut call = self.hub.projects().indexes_documents_list(&self.opt.arg_project_id, &self.opt.arg_index_id, page_size, &self.opt.arg_page_token, &self.opt.arg_view);
for parg in self.opt.arg_v.iter() {
let (key, value) = parse_kv_arg(&*parg, err);
match key {
"$-xgafv"
|"access-token"
|"alt"
|"bearer-token"
|"callback"
|"fields"
|"key"
|"oauth-token"
|"pp"
|"pretty-print"
|"quota-user" => {
let map = [
("$-xgafv", "$.xgafv"),
("access-token", "access_token"),
("bearer-token", "bearer_token"),
("oauth-token", "oauth_token"),
("pretty-print", "prettyPrint"),
("quota-user", "quotaUser"),
];
call = call.param(map.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"))
},
_ => err.issues.push(CLIError::UnknownParameter(key.to_string())),
}
}
let protocol = "standard-request";
if dry_run {
None
} else {
assert!(err.issues.len() == 0);
let mut ostream = writer_from_opts(self.opt.flag_o, &self.opt.arg_out);
match match protocol {
"standard-request" => call.doit(),
_ => unreachable!(),
} {
Err(api_err) => Some(api_err),
Ok((mut response, output_schema)) => {
println!("DEBUG: REMOVE ME {:?}", response);
serde::json::to_writer(&mut ostream, &output_schema).unwrap();
None
}
}
}
}
fn _projects_indexes_list(&self, dry_run: bool, err: &mut InvalidOptionsError)
-> Option<api::Error> {
let page_size: i32 = arg_from_str(&self.opt.arg_page_size, err, "<page-size>", "integer");
let mut call = self.hub.projects().indexes_list(&self.opt.arg_project_id, &self.opt.arg_index_name_prefix, page_size, &self.opt.arg_page_token, &self.opt.arg_view);
for parg in self.opt.arg_v.iter() {
let (key, value) = parse_kv_arg(&*parg, err);
match key {
"$-xgafv"
|"access-token"
|"alt"
|"bearer-token"
|"callback"
|"fields"
|"key"
|"oauth-token"
|"pp"
|"pretty-print"
|"quota-user" => {
let map = [
("$-xgafv", "$.xgafv"),
("access-token", "access_token"),
("bearer-token", "bearer_token"),
("oauth-token", "oauth_token"),
("pretty-print", "prettyPrint"),
("quota-user", "quotaUser"),
];
call = call.param(map.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"))
},
_ => err.issues.push(CLIError::UnknownParameter(key.to_string())),
}
}
let protocol = "standard-request";
if dry_run {
None
} else {
assert!(err.issues.len() == 0);
let mut ostream = writer_from_opts(self.opt.flag_o, &self.opt.arg_out);
match match protocol {
"standard-request" => call.doit(),
_ => unreachable!(),
} {
Err(api_err) => Some(api_err),
Ok((mut response, output_schema)) => {
println!("DEBUG: REMOVE ME {:?}", response);
serde::json::to_writer(&mut ostream, &output_schema).unwrap();
None
}
}
}
}
fn _projects_indexes_search(&self, dry_run: bool, err: &mut InvalidOptionsError)
-> Option<api::Error> {
let page_size: i32 = arg_from_str(&self.opt.arg_page_size, err, "<page-size>", "integer");
let offset: i32 = arg_from_str(&self.opt.arg_offset, err, "<offset>", "integer");
let matched_count_accuracy: i32 = arg_from_str(&self.opt.arg_matched_count_accuracy, err, "<matched-count-accuracy>", "integer");
let scorer_size: i32 = arg_from_str(&self.opt.arg_scorer_size, err, "<scorer-size>", "integer");
let mut call = self.hub.projects().indexes_search(&self.opt.arg_project_id, &self.opt.arg_index_id, &self.opt.arg_query, &self.opt.arg_field_expressions, page_size, &self.opt.arg_page_token, offset, matched_count_accuracy, &self.opt.arg_order_by, &self.opt.arg_scorer, scorer_size, &self.opt.arg_return_fields);
for parg in self.opt.arg_v.iter() {
let (key, value) = parse_kv_arg(&*parg, err);
match key {
"$-xgafv"
|"access-token"
|"alt"
|"bearer-token"
|"callback"
|"fields"
|"key"
|"oauth-token"
|"pp"
|"pretty-print"
|"quota-user" => {
let map = [
("$-xgafv", "$.xgafv"),
("access-token", "access_token"),
("bearer-token", "bearer_token"),
("oauth-token", "oauth_token"),
("pretty-print", "prettyPrint"),
("quota-user", "quotaUser"),
];
call = call.param(map.iter().find(|t| t.0 == key).unwrap_or(&("", key)).1, value.unwrap_or("unset"))
},
_ => err.issues.push(CLIError::UnknownParameter(key.to_string())),
}
}
let protocol = "standard-request";
if dry_run {
None
} else {
assert!(err.issues.len() == 0);
let mut ostream = writer_from_opts(self.opt.flag_o, &self.opt.arg_out);
match match protocol {
"standard-request" => call.doit(),
_ => unreachable!(),
} {
Err(api_err) => Some(api_err),
Ok((mut response, output_schema)) => {
println!("DEBUG: REMOVE ME {:?}", response);
serde::json::to_writer(&mut ostream, &output_schema).unwrap();
None
}
}
}
}
fn _doit(&self, dry_run: bool) -> (Option<api::Error>, Option<InvalidOptionsError>) {
let mut err = InvalidOptionsError::new();
let mut call_result: Option<api::Error>;
let mut err_opt: Option<InvalidOptionsError> = None;
if self.opt.cmd_projects {
if self.opt.cmd_indexes_documents_create {
call_result = self._projects_indexes_documents_create(dry_run, &mut err);
} else if self.opt.cmd_indexes_documents_delete {
call_result = self._projects_indexes_documents_delete(dry_run, &mut err);
} else if self.opt.cmd_indexes_documents_get {
call_result = self._projects_indexes_documents_get(dry_run, &mut err);
} else if self.opt.cmd_indexes_documents_list {
call_result = self._projects_indexes_documents_list(dry_run, &mut err);
} else if self.opt.cmd_indexes_list {
call_result = self._projects_indexes_list(dry_run, &mut err);
} else if self.opt.cmd_indexes_search {
call_result = self._projects_indexes_search(dry_run, &mut err);
} else {
unreachable!();
}
} else {
else {
unreachable!();
}
@@ -422,21 +77,37 @@ impl Engine {
Ok(p) => p,
};
match cmn::application_secret_from_directory(&config_dir, "cloudsearch1-secret.json") {
match cmn::application_secret_from_directory(&config_dir, "cloudsearch1-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 auth = Authenticator::new(&secret, DefaultAuthenticatorDelegate,
hyper::Client::new(),
JsonTokenStorage {
program_name: "cloudsearch1",
db_dir: config_dir.clone(),
}, None);
let auth = Authenticator::new( &secret, DefaultAuthenticatorDelegate,
if opt.flag_debug_auth {
hyper::Client::with_connector(mock::TeeConnector {
connector: hyper::net::HttpConnector(None)
})
} else {
hyper::Client::new()
},
JsonTokenStorage {
program_name: "cloudsearch1",
db_dir: config_dir.clone(),
}, None);
let client =
if opt.flag_debug {
hyper::Client::with_connector(mock::TeeConnector {
connector: hyper::net::HttpConnector(None)
})
} else {
hyper::Client::new()
};
let engine = Engine {
opt: opt,
hub: api::Cloudsearch::new(hyper::Client::new(), auth),
hub: api::Cloudsearch::new(client, auth),
};
match engine._doit(true) {
@@ -456,12 +127,13 @@ fn main() {
let opts: Options = Options::docopt().decode().unwrap_or_else(|e| e.exit());
match Engine::new(opts) {
Err(err) => {
write!(io::stderr(), "{}", err).ok();
writeln!(io::stderr(), "{}", err).ok();
env::set_exit_status(err.exit_code);
},
Ok(engine) => {
if let Some(err) = engine.doit() {
write!(io::stderr(), "{}", err).ok();
writeln!(io::stderr(), "{:?}", err).ok();
writeln!(io::stderr(), "{}", err).ok();
env::set_exit_status(1);
}
}