Get started with a prettier server package

Julia and Antonio Scandurra created

Co-Authored-By: Antonio Scandurra <antonio@zed.dev>

Change summary

Cargo.lock                                         |  4 +
Cargo.toml                                         |  1 
crates/prettier/Cargo.toml                         |  9 ++
crates/prettier/prettier_server/.zed/settings.json |  7 ++
crates/prettier/prettier_server/package.json       | 11 +++
crates/prettier/prettier_server/src/index.js       | 56 ++++++++++++++++
crates/prettier/src/prettier.rs                    | 14 ++++
7 files changed, 102 insertions(+)

Detailed changes

Cargo.lock 🔗

@@ -5517,6 +5517,10 @@ version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 
+[[package]]
+name = "prettier"
+version = "0.1.0"
+
 [[package]]
 name = "pretty_assertions"
 version = "1.4.0"

Cargo.toml 🔗

@@ -52,6 +52,7 @@ members = [
     "crates/plugin",
     "crates/plugin_macros",
     "crates/plugin_runtime",
+    "crates/prettier",
     "crates/project",
     "crates/project_panel",
     "crates/project_symbols",

crates/prettier/Cargo.toml 🔗

@@ -0,0 +1,9 @@
+[package]
+name = "prettier"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+
+[lib]
+path = "src/prettier.rs"

crates/prettier/prettier_server/package.json 🔗

@@ -0,0 +1,11 @@
+{
+  "name": "prettier_server",
+  "version": "1.0.0",
+  "description": "",
+  "main": "src/index.js",
+  "scripts": {
+    "start": "node src/index.js",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "Zed Industries"
+}

crates/prettier/prettier_server/src/index.js 🔗

@@ -0,0 +1,56 @@
+const { Buffer } = require('buffer');
+
+let buffer = Buffer.alloc(0);
+process.stdin.resume();
+process.stdin.on('data', (data) => {
+    buffer = Buffer.concat([buffer, data]);
+    handleData();
+});
+process.stdin.on('end', () => {
+    handleData();
+});
+
+function handleData() {
+    if (buffer.length < 4) {
+        return;
+    }
+
+    const length = buffer.readUInt32LE(0);
+    console.log(length);
+    if (buffer.length < 4 + length) {
+        return;
+    }
+
+    const bytes = buffer.subarray(4, 4 + length);
+    buffer = buffer.subarray(4 + length);
+
+    try {
+        const message = JSON.parse(bytes);
+        handleMessage(message);
+    } catch (_) {
+        sendResponse(makeError("Request JSON parse error"));
+        return;
+    }
+}
+
+// format
+// clear_cache
+// shutdown
+// error
+
+function handleMessage(message) {
+    console.log(message);
+    sendResponse({ method: "hi", result: null });
+}
+
+function makeError(message) {
+    return { method: "error", message };
+}
+
+function sendResponse(response) {
+    let message = Buffer.from(JSON.stringify(response));
+    let length = Buffer.alloc(4);
+    length.writeUInt32LE(message.length);
+    process.stdout.write(length);
+    process.stdout.write(message);
+}

crates/prettier/src/prettier.rs 🔗

@@ -0,0 +1,14 @@
+pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_works() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+}