1use crate::directory::entry_container::Directory;
8use crate::path::Path;
9use fidl_fuchsia_io as fio;
10use std::sync::Arc;
11
12#[macro_use]
13pub mod test_utils;
14
15pub mod common;
16
17pub mod immutable;
18pub mod mutable;
19
20mod connection;
21pub mod dirents_sink;
22pub mod entry;
23pub mod entry_container;
24pub mod helper;
25pub mod read_dirents;
26pub mod simple;
27pub mod traversal_position;
28pub mod watchers;
29
30#[derive(Clone)]
32pub struct DirectoryOptions {
33 pub(crate) rights: fio::Operations,
34}
35
36impl DirectoryOptions {
37 pub(crate) fn to_io1(&self) -> fio::OpenFlags {
38 let mut flags = fio::OpenFlags::empty();
43 if self.rights.contains(fio::R_STAR_DIR) {
44 flags |= fio::OpenFlags::RIGHT_READABLE;
45 }
46 if self.rights.contains(fio::W_STAR_DIR) {
47 flags |= fio::OpenFlags::RIGHT_WRITABLE;
48 }
49 if self.rights.contains(fio::X_STAR_DIR) {
50 flags |= fio::OpenFlags::RIGHT_EXECUTABLE;
51 }
52 flags
53 }
54}
55
56impl From<&DirectoryOptions> for fio::Flags {
57 fn from(options: &DirectoryOptions) -> Self {
58 fio::Flags::PROTOCOL_DIRECTORY | fio::Flags::from_bits_truncate(options.rights.bits())
60 }
61}
62
63impl Default for DirectoryOptions {
64 fn default() -> Self {
65 DirectoryOptions { rights: fio::R_STAR_DIR }
66 }
67}
68
69pub fn serve<D: Directory + ?Sized>(directory: Arc<D>, flags: fio::Flags) -> fio::DirectoryProxy {
73 crate::serve_directory(directory, Path::dot(), flags)
74}
75
76pub fn serve_read_only<D: Directory + ?Sized>(directory: Arc<D>) -> fio::DirectoryProxy {
80 crate::serve_directory(directory, Path::dot(), fio::PERM_READABLE)
81}