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) }