99 lines
2.2 KiB
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)
|
|
}
|