inou/claude-edit/main.go

99 lines
2.2 KiB
Go

package main
import (
"encoding/json"
"os"
"path/filepath"
"strings"
)
type Request struct {
Action string `json:"action"`
Path string `json:"path"`
Content string `json:"content,omitempty"`
Find string `json:"find,omitempty"`
Replace string `json:"replace,omitempty"`
All bool `json:"all,omitempty"`
}
type Response struct {
OK bool `json:"ok"`
Content string `json:"content,omitempty"`
Error string `json:"error,omitempty"`
Count int `json:"count,omitempty"`
}
func main() {
var req Request
if err := json.NewDecoder(os.Stdin).Decode(&req); err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
switch req.Action {
case "read":
data, err := os.ReadFile(req.Path)
if err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
respond(Response{OK: true, Content: string(data)})
case "write":
os.MkdirAll(filepath.Dir(req.Path), 0755)
if err := os.WriteFile(req.Path, []byte(req.Content), 0644); err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
respond(Response{OK: true})
case "append":
os.MkdirAll(filepath.Dir(req.Path), 0755)
f, err := os.OpenFile(req.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
defer f.Close()
if _, err = f.WriteString(req.Content); err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
respond(Response{OK: true})
case "replace":
data, err := os.ReadFile(req.Path)
if err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
old := string(data)
count := strings.Count(old, req.Find)
if count == 0 {
respond(Response{OK: false, Error: "pattern not found"})
return
}
n := 1
if req.All {
n = -1
}
newData := strings.Replace(old, req.Find, req.Replace, n)
if err := os.WriteFile(req.Path, []byte(newData), 0644); err != nil {
respond(Response{OK: false, Error: err.Error()})
return
}
if req.All {
respond(Response{OK: true, Count: count})
} else {
respond(Response{OK: true, Count: 1})
}
default:
respond(Response{OK: false, Error: "unknown action: " + req.Action})
}
}
func respond(r Response) {
json.NewEncoder(os.Stdout).Encode(r)
}