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 moniker::Moniker;
8
9use flex_client::ProxyHasDomain;
10use flex_fuchsia_sys2 as fsys;
11
12async fn get_storage_admin(
13    realm_query: fsys::RealmQueryProxy,
14    storage_provider_moniker: String,
15    storage_capability_name: String,
16) -> Result<fsys::StorageAdminProxy> {
17    let storage_provider_moniker = Moniker::parse_str(&storage_provider_moniker).map_err(|e| {
18        format_err!("Error: {} is not a valid moniker ({})", storage_provider_moniker, e)
19    })?;
20
21    let (storage_admin, server_end) =
22        realm_query.domain().create_proxy::<fsys::StorageAdminMarker>();
23
24    realm_query
25        .connect_to_storage_admin(
26            &storage_provider_moniker.to_string(),
27            &storage_capability_name,
28            server_end,
29        )
30        .await?
31        .map_err(|e| {
32            format_err!(
33                "Failed to get StorageAdmin proxy for capability '{}' of instance '{}': {:?}",
34                storage_capability_name,
35                storage_provider_moniker,
36                e
37            )
38        })?;
39
40    Ok(storage_admin)
41}
42
43pub async fn storage_copy_cmd(
44    storage_provider_moniker: String,
45    storage_capability_name: String,
46    source_path: String,
47    destination_path: String,
48    realm_query: fsys::RealmQueryProxy,
49) -> Result<()> {
50    let storage_admin =
51        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
52    copy(storage_admin, source_path, destination_path).await
53}
54
55pub async fn storage_list_cmd<W: std::io::Write>(
56    storage_provider_moniker: String,
57    storage_capability_name: String,
58    path: String,
59    realm_query: fsys::RealmQueryProxy,
60    mut writer: W,
61) -> Result<()> {
62    let storage_admin =
63        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
64    let entries = list(storage_admin, path).await?;
65
66    for entry in entries {
67        writeln!(writer, "{}", entry)?;
68    }
69    Ok(())
70}
71
72pub async fn storage_make_directory_cmd(
73    storage_provider_moniker: String,
74    storage_capability_name: String,
75    path: String,
76    realm_query: fsys::RealmQueryProxy,
77) -> Result<()> {
78    let storage_admin =
79        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
80    make_directory(storage_admin, path).await
81}
82
83pub async fn storage_delete_cmd(
84    storage_provider_moniker: String,
85    storage_capability_name: String,
86    path: String,
87    realm_query: fsys::RealmQueryProxy,
88) -> Result<()> {
89    let storage_admin =
90        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
91    delete(storage_admin, path).await
92}
93
94pub async fn storage_delete_all_cmd(
95    storage_provider_moniker: String,
96    storage_capability_name: String,
97    moniker: String,
98    realm_query: fsys::RealmQueryProxy,
99) -> Result<()> {
100    let storage_admin =
101        get_storage_admin(realm_query, storage_provider_moniker, storage_capability_name).await?;
102    delete_all(storage_admin, moniker).await
103}