|  | #!/usr/bin/env bash | 
|  | # Simple nine-packet LSP test for examples/minimal_lsp.rs | 
|  | # Usage (two tabs): | 
|  | # | 
|  | #   mkfifo /tmp/lsp_pipe          # one-time setup | 
|  | #   # tab 1 – run the server | 
|  | #   cat /tmp/lsp_pipe | cargo run --example minimal_lsp | 
|  | # | 
|  | #   # tab 2 – fire the packets (this script) | 
|  | #   bash examples/manual_test.sh          # blocks until server exits | 
|  | # | 
|  | # If you don’t use a second tab, run the script in the background: | 
|  | # | 
|  | #   bash examples/manual_test.sh &        # writer in background | 
|  | #   cat /tmp/lsp_pipe | cargo run --example minimal_lsp | 
|  | # | 
|  | # The script opens /tmp/lsp_pipe for writing (exec 3>) and sends each JSON | 
|  | # packet with a correct Content-Length header. | 
|  | # | 
|  | # One-liner alternative (single terminal, no FIFO): | 
|  | # | 
|  | #   cargo run --example minimal_lsp <<'EOF' | 
|  | #     … nine packets … | 
|  | #   EOF | 
|  | # | 
|  | # Both approaches feed identical bytes to minimal_lsp via stdin. | 
|  |  | 
|  | set -eu | 
|  | PIPE=${1:-/tmp/lsp_pipe} | 
|  |  | 
|  | mkfifo -m 600 "$PIPE" 2>/dev/null || true       # create once, ignore if exists | 
|  |  | 
|  | # open write end so the fifo stays open | 
|  | exec 3> "$PIPE" | 
|  |  | 
|  | send() { | 
|  | local body=$1 | 
|  | local len=$(printf '%s' "$body" | wc -c) | 
|  | printf 'Content-Length: %d\r\n\r\n%s' "$len" "$body" >&3 | 
|  | } | 
|  |  | 
|  | send '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"capabilities":{}}}' | 
|  | send '{"jsonrpc":"2.0","method":"initialized","params":{}}' | 
|  | send '{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///tmp/foo.rs","languageId":"rust","version":1,"text":"fn  main( ){println!(\"hi\") }"}}}' | 
|  | send '{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///tmp/foo.rs"},"position":{"line":0,"character":0}}}' | 
|  | send '{"jsonrpc":"2.0","id":3,"method":"textDocument/hover","params":{"textDocument":{"uri":"file:///tmp/foo.rs"},"position":{"line":0,"character":0}}}' | 
|  | send '{"jsonrpc":"2.0","id":4,"method":"textDocument/definition","params":{"textDocument":{"uri":"file:///tmp/foo.rs"},"position":{"line":0,"character":0}}}' | 
|  | send '{"jsonrpc":"2.0","id":5,"method":"textDocument/formatting","params":{"textDocument":{"uri":"file:///tmp/foo.rs"},"options":{"tabSize":4,"insertSpaces":true}}}' | 
|  | send '{"jsonrpc":"2.0","id":6,"method":"shutdown","params":null}' | 
|  | send '{"jsonrpc":"2.0","method":"exit","params":null}' | 
|  |  | 
|  | exec 3>&- | 
|  | echo "Packets sent – watch the other terminal for responses." |