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,
4    FileMetadata, HostCall, ListDirRequest, ListDirResponse, MetadataRequest, MetadataResponse,
5    ReadFileRequest, ReadFileResponse, RemoveDirRequest, RemoveDirResponse, RemoveFileRequest,
6    RemoveFileResponse, RenameRequest, RenameResponse, WriteFileRequest, WriteFileResponse,
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 {
63        path,
64    })));
65    let response: RemoveFileResponse = unpack(pack);
66    match response {
67        RemoveFileResponse::Ok => Ok(()),
68        RemoveFileResponse::Err(err) => Err(err),
69    }
70}
71
72pub fn remove_dir(path: String, recursive: bool) -> Result<(), String> {
73    let pack = host_call(HostCall::File(FileCall::RemoveDir(RemoveDirRequest {
74        path,
75        recursive,
76    })));
77    let response: RemoveDirResponse = unpack(pack);
78    match response {
79        RemoveDirResponse::Ok => Ok(()),
80        RemoveDirResponse::Err(err) => Err(err),
81    }
82}
83
84pub fn rename(from: String, to: String) -> Result<(), String> {
85    let pack = host_call(HostCall::File(FileCall::Rename(RenameRequest { from, to })));
86    let response: RenameResponse = unpack(pack);
87    match response {
88        RenameResponse::Ok => Ok(()),
89        RenameResponse::Err(err) => Err(err),
90    }
91}
92
93pub fn copy(from: String, to: String, recursive: bool) -> Result<(), String> {
94    let pack = host_call(HostCall::File(FileCall::Copy(CopyRequest {
95        from,
96        to,
97        recursive,
98    })));
99    let response: CopyResponse = unpack(pack);
100    match response {
101        CopyResponse::Ok => Ok(()),
102        CopyResponse::Err(err) => Err(err),
103    }
104}
105
106pub struct File;
107
108impl File {
109    pub fn read(&self, path: String) -> Result<Vec<u8>, String> {
110        read_file(path)
111    }
112
113    pub fn write(&self, path: String, data: Vec<u8>, append: bool) -> Result<(), String> {
114        write_file(path, data, append)
115    }
116
117    pub fn list_dir(&self, path: String) -> Result<Vec<DirEntry>, String> {
118        list_dir(path)
119    }
120
121    pub fn metadata(&self, path: String) -> Result<FileMetadata, String> {
122        metadata(path)
123    }
124
125    pub fn create_dir(&self, path: String, recursive: bool) -> Result<(), String> {
126        create_dir(path, recursive)
127    }
128
129    pub fn remove_file(&self, path: String) -> Result<(), String> {
130        remove_file(path)
131    }
132
133    pub fn remove_dir(&self, path: String, recursive: bool) -> Result<(), String> {
134        remove_dir(path, recursive)
135    }
136
137    pub fn rename(&self, from: String, to: String) -> Result<(), String> {
138        rename(from, to)
139    }
140
141    pub fn copy(&self, from: String, to: String, recursive: bool) -> Result<(), String> {
142        copy(from, to, recursive)
143    }
144}