Skip to main content

interstice_sdk_core/host_calls/
file.rs

1use crate::host_calls::{host_call, unpack};
2use interstice_abi::{
3    CopyRequest, CopyResponse, CreateDirRequest, CreateDirResponse, DirEntry, FileCall, HostCall,
4    ListDirRequest, ListDirResponse, MetadataRequest, MetadataResponse, ReadFileRequest,
5    ReadFileResponse, RemoveDirRequest, RemoveDirResponse, RemoveFileRequest, RemoveFileResponse,
6    RenameRequest, RenameResponse, WriteFileRequest, WriteFileResponse, FileMetadata,
7};
8
9pub fn read_file(path: String) -> Result<Vec<u8>, String> {
10    let pack = host_call(HostCall::File(FileCall::ReadFile(ReadFileRequest { path })));
11    let response: ReadFileResponse = unpack(pack);
12    match response {
13        ReadFileResponse::Ok(data) => Ok(data),
14        ReadFileResponse::Err(err) => Err(err),
15    }
16}
17
18pub fn write_file(path: String, data: Vec<u8>, append: bool) -> Result<(), String> {
19    let pack = host_call(HostCall::File(FileCall::WriteFile(WriteFileRequest {
20        path,
21        data,
22        append,
23    })));
24    let response: WriteFileResponse = unpack(pack);
25    match response {
26        WriteFileResponse::Ok => Ok(()),
27        WriteFileResponse::Err(err) => Err(err),
28    }
29}
30
31pub fn list_dir(path: String) -> Result<Vec<DirEntry>, String> {
32    let pack = host_call(HostCall::File(FileCall::ListDir(ListDirRequest { path })));
33    let response: ListDirResponse = unpack(pack);
34    match response {
35        ListDirResponse::Ok(entries) => Ok(entries),
36        ListDirResponse::Err(err) => Err(err),
37    }
38}
39
40pub fn metadata(path: String) -> Result<FileMetadata, String> {
41    let pack = host_call(HostCall::File(FileCall::Metadata(MetadataRequest { path })));
42    let response: MetadataResponse = unpack(pack);
43    match response {
44        MetadataResponse::Ok(meta) => Ok(meta),
45        MetadataResponse::Err(err) => Err(err),
46    }
47}
48
49pub fn create_dir(path: String, recursive: bool) -> Result<(), String> {
50    let pack = host_call(HostCall::File(FileCall::CreateDir(CreateDirRequest {
51        path,
52        recursive,
53    })));
54    let response: CreateDirResponse = unpack(pack);
55    match response {
56        CreateDirResponse::Ok => Ok(()),
57        CreateDirResponse::Err(err) => Err(err),
58    }
59}
60
61pub fn remove_file(path: String) -> Result<(), String> {
62    let pack = host_call(HostCall::File(FileCall::RemoveFile(RemoveFileRequest { path })));
63    let response: RemoveFileResponse = unpack(pack);
64    match response {
65        RemoveFileResponse::Ok => Ok(()),
66        RemoveFileResponse::Err(err) => Err(err),
67    }
68}
69
70pub fn remove_dir(path: String, recursive: bool) -> Result<(), String> {
71    let pack = host_call(HostCall::File(FileCall::RemoveDir(RemoveDirRequest {
72        path,
73        recursive,
74    })));
75    let response: RemoveDirResponse = unpack(pack);
76    match response {
77        RemoveDirResponse::Ok => Ok(()),
78        RemoveDirResponse::Err(err) => Err(err),
79    }
80}
81
82pub fn rename(from: String, to: String) -> Result<(), String> {
83    let pack = host_call(HostCall::File(FileCall::Rename(RenameRequest { from, to })));
84    let response: RenameResponse = unpack(pack);
85    match response {
86        RenameResponse::Ok => Ok(()),
87        RenameResponse::Err(err) => Err(err),
88    }
89}
90
91pub fn copy(from: String, to: String, recursive: bool) -> Result<(), String> {
92    let pack = host_call(HostCall::File(FileCall::Copy(CopyRequest {
93        from,
94        to,
95        recursive,
96    })));
97    let response: CopyResponse = unpack(pack);
98    match response {
99        CopyResponse::Ok => Ok(()),
100        CopyResponse::Err(err) => Err(err),
101    }
102}
103
104pub struct File;
105
106impl File {
107    pub fn read(&self, path: String) -> Result<Vec<u8>, String> {
108        read_file(path)
109    }
110
111    pub fn write(&self, path: String, data: Vec<u8>, append: bool) -> Result<(), String> {
112        write_file(path, data, append)
113    }
114
115    pub fn list_dir(&self, path: String) -> Result<Vec<DirEntry>, String> {
116        list_dir(path)
117    }
118
119    pub fn metadata(&self, path: String) -> Result<FileMetadata, String> {
120        metadata(path)
121    }
122
123    pub fn create_dir(&self, path: String, recursive: bool) -> Result<(), String> {
124        create_dir(path, recursive)
125    }
126
127    pub fn remove_file(&self, path: String) -> Result<(), String> {
128        remove_file(path)
129    }
130
131    pub fn remove_dir(&self, path: String, recursive: bool) -> Result<(), String> {
132        remove_dir(path, recursive)
133    }
134
135    pub fn rename(&self, from: String, to: String) -> Result<(), String> {
136        rename(from, to)
137    }
138
139    pub fn copy(&self, from: String, to: String, recursive: bool) -> Result<(), String> {
140        copy(from, to, recursive)
141    }
142}