diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 00000000..a3366429 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,20 @@ +# Rojo Design +This is a super rough draft that I'm trying to use to lay out of my thoughts. + +## API + +### POST `/read` +Accepts a `Vec` of items to read. + +Returns `Vec>`, in the same order as the request. + +### POST `/write` +Accepts a `Vec<{ Route, RbxItem }>` of items to write. + +I imagine that the `Name` attribute of the top-level `RbxItem` would be ignored in favor of the route name? + +## CLI + +### Transform Plugins + +## Roblox Studio Plugin \ No newline at end of file diff --git a/src/rbx.rs b/src/rbx.rs index 043dc3b6..234529ca 100644 --- a/src/rbx.rs +++ b/src/rbx.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RbxItem { pub name: String, @@ -9,7 +9,7 @@ pub struct RbxItem { pub properties: HashMap, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase", tag = "type")] pub enum RbxValue { String { diff --git a/src/web.rs b/src/web.rs index 2a0e1118..f4237a1e 100644 --- a/src/web.rs +++ b/src/web.rs @@ -40,6 +40,13 @@ struct ChangesResult<'a> { current_time: f64, } +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct WriteSpecifier { + route: String, + item: RbxItem, +} + fn json(value: T) -> rouille::Response { let data = serde_json::to_string(&value).unwrap(); rouille::Response::from_data("application/json", data) @@ -181,6 +188,13 @@ pub fn start(config: Config, project: Project, vfs: Arc>) { }, (POST) (/write) => { + let _plugin_chain = PLUGIN_CHAIN.lock().unwrap(); + + let _write_request: Vec = match read_json(&request) { + Some(v) => v, + None => return rouille::Response::empty_400(), + }; + rouille::Response::empty_404() },