file-restore: allow specifying output-format

Makes CLI use more comfortable by not just printing JSON to the
terminal.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
This commit is contained in:
Stefan Reiter 2021-03-31 12:21:49 +02:00 committed by Thomas Lamprecht
parent 76425d84b3
commit 9fe3358ce6
1 changed files with 37 additions and 5 deletions

View File

@ -4,11 +4,14 @@ use std::path::PathBuf;
use std::sync::Arc; use std::sync::Arc;
use anyhow::{bail, format_err, Error}; use anyhow::{bail, format_err, Error};
use serde_json::Value; use serde_json::{json, Value};
use proxmox::api::{ use proxmox::api::{
api, api,
cli::{run_cli_command, CliCommand, CliCommandMap, CliEnvironment}, cli::{
default_table_format_options, format_and_print_result_full, get_output_format,
run_cli_command, CliCommand, CliCommandMap, CliEnvironment, ColumnConfig, OUTPUT_FORMAT,
},
}; };
use pxar::accessor::aio::Accessor; use pxar::accessor::aio::Accessor;
@ -99,6 +102,17 @@ fn parse_path(path: String, base64: bool) -> Result<ExtractPath, Error> {
type: CryptMode, type: CryptMode,
optional: true, optional: true,
}, },
"output-format": {
schema: OUTPUT_FORMAT,
optional: true,
},
}
},
returns: {
description: "A list of elements under the given path",
type: Array,
items: {
type: ArchiveEntry,
} }
} }
)] )]
@ -108,7 +122,7 @@ async fn list(
path: String, path: String,
base64: bool, base64: bool,
param: Value, param: Value,
) -> Result<Vec<ArchiveEntry>, Error> { ) -> Result<(), Error> {
let repo = extract_repository_from_value(&param)?; let repo = extract_repository_from_value(&param)?;
let snapshot: BackupDir = snapshot.parse()?; let snapshot: BackupDir = snapshot.parse()?;
let path = parse_path(path, base64)?; let path = parse_path(path, base64)?;
@ -141,7 +155,7 @@ async fn list(
let (manifest, _) = client.download_manifest().await?; let (manifest, _) = client.download_manifest().await?;
manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?; manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?;
match path { let result = match path {
ExtractPath::ListArchives => { ExtractPath::ListArchives => {
let mut entries = vec![]; let mut entries = vec![];
for file in manifest.files() { for file in manifest.files() {
@ -177,7 +191,25 @@ async fn list(
helpers::list_dir_content(&mut catalog_reader, &fullpath) helpers::list_dir_content(&mut catalog_reader, &fullpath)
} }
} }?;
let options = default_table_format_options()
.sortby("type", false)
.sortby("text", false)
.column(ColumnConfig::new("type"))
.column(ColumnConfig::new("text").header("name"))
.column(ColumnConfig::new("mtime").header("last modified"))
.column(ColumnConfig::new("size"));
let output_format = get_output_format(&param);
format_and_print_result_full(
&mut json!(result),
&API_METHOD_LIST.returns,
&output_format,
&options,
);
Ok(())
} }
#[api( #[api(