1use crate::directory::entry_container::Directory;
8use crate::execution_scope::ExecutionScope;
9use crate::object_request::ToObjectRequest as _;
10use crate::path::Path;
11use flex_client::fidl::ServerEnd;
12use flex_fuchsia_io as fio;
13use std::sync::Arc;
14
15#[cfg(test)]
16#[macro_use]
17pub(crate) mod test_utils;
18
19pub mod common;
20
21pub mod immutable;
22pub mod mutable;
23
24mod connection;
25pub mod dirents_sink;
26pub mod entry;
27pub mod entry_container;
28pub mod helper;
29pub mod read_dirents;
30pub mod simple;
31pub mod traversal_position;
32pub mod watchers;
33
34#[derive(Clone)]
36pub struct DirectoryOptions {
37 pub(crate) rights: fio::Operations,
38}
39
40impl DirectoryOptions {
41 pub(crate) fn to_io1(&self) -> fio::OpenFlags {
42 let mut flags = fio::OpenFlags::empty();
47 if self.rights.contains(fio::R_STAR_DIR) {
48 flags |= fio::OpenFlags::RIGHT_READABLE;
49 }
50 if self.rights.contains(fio::W_STAR_DIR) {
51 flags |= fio::OpenFlags::RIGHT_WRITABLE;
52 }
53 if self.rights.contains(fio::X_STAR_DIR) {
54 flags |= fio::OpenFlags::RIGHT_EXECUTABLE;
55 }
56 flags
57 }
58}
59
60impl From<&DirectoryOptions> for fio::Flags {
61 fn from(options: &DirectoryOptions) -> Self {
62 fio::Flags::PROTOCOL_DIRECTORY | fio::Flags::from_bits_truncate(options.rights.bits())
64 }
65}
66
67impl Default for DirectoryOptions {
68 fn default() -> Self {
69 DirectoryOptions { rights: fio::R_STAR_DIR }
70 }
71}
72
73pub fn serve<D: Directory + ?Sized>(
77 directory: Arc<D>,
78 scope: ExecutionScope,
79 flags: fio::Flags,
80) -> fio::DirectoryProxy {
81 crate::serve_directory(directory, Path::dot(), scope, flags)
82}
83
84pub fn serve_read_only<D: Directory + ?Sized>(
88 directory: Arc<D>,
89 scope: ExecutionScope,
90) -> fio::DirectoryProxy {
91 crate::serve_directory(directory, Path::dot(), scope, fio::PERM_READABLE)
92}
93
94pub fn serve_on<D: Directory + ?Sized>(
97 directory: Arc<D>,
98 flags: fio::Flags,
99 scope: ExecutionScope,
100 server_end: ServerEnd<fio::DirectoryMarker>,
101) {
102 let request = flags.to_object_request(server_end);
103 request.handle(|request| directory.open(scope, Path::dot(), flags, request));
104}