component_debug/cli/
storage.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::storage::{copy, delete, delete_all, list, make_directory};
6use anyhow::{format_err, Result};
7use fidl_fuchsia_sys2 as fsys;
8use moniker::Moniker;
9
10async fn get_storage_admin(
11    realm_query: fsys::RealmQueryProxy,
12    storage_provider_moniker: String,
13    storage_capability_name: String,
14) -> Result<fsys::StorageAdminProxy> {
15    let storage_provider_moniker = Moniker::parse_str(&storage_provider_moniker).map_err(|e| {
16        format_err!("Error: {} is not a valid moniker ({})", storage_provider_moniker, e)
17    })?;
18
19    let (storage_admin, server_end) = fidl::endpoints::create_proxy::<fsys::StorageAdminMarker>();
20
21    realm_query
22        .connect_to_storage_admin(
23            &storage_provider_moniker.to_string(),
24            &storage_capability_name,
25            server_end,
26        )
27        .await?
28        .map_err(|e| {
29            format_err!(
30                "Failed to get StorageAdmin proxy for capability '{}' of instance '{}': {:?}",
31                storage_capability_name,
32                storage_provider_moniker,
33                e
34            )
35        })?;
36
37    Ok(storage_admin)
38}
39
40pub async fn storage_copy_cmd(
41    storage_provider_moniker: String,
42    storage_capability_name: String,
43    source_path: String,
44    destination_path: String,
45    realm_query: fsys::RealmQueryProxy,
46) -> Result<()> {
47    let storage_admin =
48        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
49    copy(storage_admin, source_path, destination_path).await
50}
51
52pub async fn storage_list_cmd<W: std::io::Write>(
53    storage_provider_moniker: String,
54    storage_capability_name: String,
55    path: String,
56    realm_query: fsys::RealmQueryProxy,
57    mut writer: W,
58) -> Result<()> {
59    let storage_admin =
60        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
61    let entries = list(storage_admin, path).await?;
62
63    for entry in entries {
64        writeln!(writer, "{}", entry)?;
65    }
66    Ok(())
67}
68
69pub async fn storage_make_directory_cmd(
70    storage_provider_moniker: String,
71    storage_capability_name: String,
72    path: String,
73    realm_query: fsys::RealmQueryProxy,
74) -> Result<()> {
75    let storage_admin =
76        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
77    make_directory(storage_admin, path).await
78}
79
80pub async fn storage_delete_cmd(
81    storage_provider_moniker: String,
82    storage_capability_name: String,
83    path: String,
84    realm_query: fsys::RealmQueryProxy,
85) -> Result<()> {
86    let storage_admin =
87        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
88    delete(storage_admin, path).await
89}
90
91pub async fn storage_delete_all_cmd(
92    storage_provider_moniker: String,
93    storage_capability_name: String,
94    moniker: String,
95    realm_query: fsys::RealmQueryProxy,
96) -> Result<()> {
97    let storage_admin =
98        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
99    delete_all(storage_admin, moniker).await
100}