blob: 35b41dde0479199d91242b6d150bf1e39b5bb10b [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
crate::model::error::ModelError,
moniker::AbsoluteMoniker,
std::sync::Arc,
vfs::directory::{entry::DirectoryEntry, helper::DirectlyMutable, immutable::simple as pfs},
};
type Directory = Arc<pfs::Simple>;
/// Trait that attempts to add an entry to a vfs directory, without waiting for a result.
/// This wraps the `add_entry` method of structs that implement DirectoryEntry, streamlining
/// the error type to `ModelError`.
pub trait AddableDirectory {
/// Adds an entry to a directory. Named `add_node` instead of `add_entry` to avoid conflicts.
fn add_node(
&mut self,
name: &str,
entry: Arc<dyn DirectoryEntry>,
moniker: &AbsoluteMoniker,
) -> Result<(), ModelError>;
}
/// Trait that attempts to add an entry to a pseudo-fs directory, waiting for a result.
/// This wraps the `add_entry_res` method of structs that implement Controller, streamlining
/// the error type to `ModelError`.
pub trait AddableDirectoryWithResult {
/// Adds an entry to a directory. Named `add_node` instead of `add_entry_res` to avoid conflicts.
fn add_node<'a>(
&'a self,
name: &'a str,
entry: Arc<dyn DirectoryEntry>,
moniker: &'a AbsoluteMoniker,
) -> Result<(), ModelError>;
fn remove_node<'a>(&'a self, name: &'a str) -> Result<Arc<dyn DirectoryEntry>, ModelError>;
}
impl AddableDirectory for Directory {
fn add_node(
&mut self,
name: &str,
entry: Arc<dyn DirectoryEntry>,
moniker: &AbsoluteMoniker,
) -> Result<(), ModelError> {
self.clone()
.add_entry(name, entry)
.map_err(|_| ModelError::add_entry_error(moniker.clone(), name))
}
}
impl AddableDirectoryWithResult for Directory {
fn add_node<'a>(
&'a self,
name: &'a str,
entry: Arc<dyn DirectoryEntry>,
moniker: &'a AbsoluteMoniker,
) -> Result<(), ModelError> {
self.clone()
.add_entry(String::from(name), entry)
.map_err(|_| ModelError::add_entry_error(moniker.clone(), name))
}
fn remove_node<'a>(&'a self, name: &'a str) -> Result<Arc<dyn DirectoryEntry>, ModelError> {
self.clone()
.remove_entry(String::from(name))
.unwrap()
.ok_or(ModelError::remove_entry_error(name))
}
}