rs_teststand/workspace/
workspace_object.rs1use crate::Error;
4use crate::dispids::workspace_object;
5use rs_teststand_sys::{Dispatch, Value};
6
7#[derive(Debug)]
9pub struct WorkspaceObject {
10 dispatch: Box<dyn Dispatch>,
11}
12
13impl WorkspaceObject {
14 pub(crate) fn new(dispatch: Box<dyn Dispatch>) -> Self {
16 Self { dispatch }
17 }
18
19 pub fn display_name(&self) -> Result<String, Error> {
24 Ok(self
25 .dispatch
26 .get(workspace_object::DISPLAY_NAME)?
27 .into_string()?)
28 }
29
30 pub fn set_display_name(&self, value: &str) -> Result<(), Error> {
35 self.dispatch.put(
36 workspace_object::DISPLAY_NAME,
37 Value::Str(value.to_string()),
38 )?;
39 Ok(())
40 }
41
42 pub fn path(&self) -> Result<String, Error> {
47 Ok(self.dispatch.get(workspace_object::PATH)?.into_string()?)
48 }
49
50 pub fn set_path(&self, value: &str) -> Result<(), Error> {
55 self.dispatch
56 .put(workspace_object::PATH, Value::Str(value.to_string()))?;
57 Ok(())
58 }
59
60 pub fn file_exists(&self) -> Result<bool, Error> {
65 Ok(self
66 .dispatch
67 .get(workspace_object::FILE_EXISTS)?
68 .as_bool()?)
69 }
70
71 pub fn object_type(&self) -> Result<i32, Error> {
76 Ok(self.dispatch.get(workspace_object::OBJECT_TYPE)?.as_i32()?)
77 }
78
79 pub fn num_contained_objects(&self) -> Result<i32, Error> {
84 Ok(self
85 .dispatch
86 .get(workspace_object::NUM_CONTAINED_OBJECTS)?
87 .as_i32()?)
88 }
89
90 pub fn get_contained_object(&self, index: i32) -> Result<Self, Error> {
95 let dispatch = self
96 .dispatch
97 .call(workspace_object::GET_CONTAINED_OBJECT, &[Value::I32(index)])?
98 .into_object()?;
99 Ok(Self::new(dispatch))
100 }
101
102 pub fn get_absolute_path(&self) -> Result<String, Error> {
107 Ok(self
108 .dispatch
109 .call(workspace_object::GET_ABSOLUTE_PATH, &[])?
110 .into_string()?)
111 }
112
113 pub fn new_file(&self, path_string: &str) -> Result<Self, Error> {
118 let dispatch = self
119 .dispatch
120 .call(
121 workspace_object::NEW_FILE,
122 &[Value::Str(path_string.to_string())],
123 )?
124 .into_object()?;
125 Ok(Self::new(dispatch))
126 }
127
128 pub fn new_folder(&self, folder_name: &str) -> Result<Self, Error> {
133 let dispatch = self
134 .dispatch
135 .call(
136 workspace_object::NEW_FOLDER,
137 &[Value::Str(folder_name.to_string())],
138 )?
139 .into_object()?;
140 Ok(Self::new(dispatch))
141 }
142
143 pub fn remove_object(&self, index: i32) -> Result<Self, Error> {
148 let dispatch = self
149 .dispatch
150 .call(workspace_object::REMOVE_OBJECT, &[Value::I32(index)])?
151 .into_object()?;
152 Ok(Self::new(dispatch))
153 }
154}
155
156#[cfg(test)]
157mod tests {
158 use super::WorkspaceObject;
159 use crate::Error;
160 use crate::dispids::workspace_object;
161 use rs_teststand_sys::{ComError, Value};
162 use std::collections::HashMap;
163
164 #[derive(Debug)]
165 struct FakeDispatch {
166 responses: HashMap<i32, Value>,
167 }
168
169 impl rs_teststand_sys::Dispatch for FakeDispatch {
170 fn get(&self, dispid: i32) -> Result<Value, ComError> {
171 self.responses.get(&dispid).map_or_else(
172 || Err(ComError::hresult(0, "fake: unscripted dispid")),
173 |val| match val {
174 Value::Str(s) => Ok(Value::Str(s.clone())),
175 Value::Bool(b) => Ok(Value::Bool(*b)),
176 Value::I32(n) => Ok(Value::I32(*n)),
177 _ => Err(ComError::hresult(0, "fake")),
178 },
179 )
180 }
181
182 fn put(&self, _dispid: i32, _value: Value) -> Result<(), ComError> {
183 Err(ComError::hresult(0, "fake"))
184 }
185
186 fn call(&self, _dispid: i32, _args: &[Value]) -> Result<Value, ComError> {
187 Err(ComError::hresult(0, "fake"))
188 }
189 }
190
191 #[test]
192 fn display_name_reads_bstr_property() -> Result<(), Error> {
193 let fake = FakeDispatch {
194 responses: HashMap::from([(
195 workspace_object::DISPLAY_NAME,
196 Value::Str("MyFolder".to_string()),
197 )]),
198 };
199 let obj = WorkspaceObject::new(Box::new(fake));
200 assert_eq!(obj.display_name()?, "MyFolder");
201 Ok(())
202 }
203
204 #[test]
205 fn num_contained_objects_reads_i4_property() -> Result<(), Error> {
206 let fake = FakeDispatch {
207 responses: HashMap::from([(workspace_object::NUM_CONTAINED_OBJECTS, Value::I32(5))]),
208 };
209 let obj = WorkspaceObject::new(Box::new(fake));
210 assert_eq!(obj.num_contained_objects()?, 5);
211 Ok(())
212 }
213
214 #[test]
215 fn file_exists_reads_bool_property() -> Result<(), Error> {
216 let fake = FakeDispatch {
217 responses: HashMap::from([(workspace_object::FILE_EXISTS, Value::Bool(true))]),
218 };
219 let obj = WorkspaceObject::new(Box::new(fake));
220 assert!(obj.file_exists()?);
221 Ok(())
222 }
223}