package caddyhugo import ( "fmt" "io/ioutil" "os" "os/exec" "git.stephensearles.com/stephen/idleshut" ) type HugoInteractor interface { Render(srcdir, workdir string) HugoRenderer } type HugoRenderer interface { WriteContent(contents string) error Start() error Stop() error } func HugoCmdProcessConfig(ch *CaddyHugo, es *editSession, touchFn func()) idleshut.Config { cmd := exec.Command("hugo", "--watch", "-D", "-d", es.tmpdir) cmd.Dir = es.tmpdir return idleshut.Config{ Tick: WebsocketFileTicker, MaxIdleTicks: uint(IdleWebsocketTimeout/WebsocketFileTicker) + 1, Start: func() error { err := cmd.Start() if err != nil { return fmt.Errorf("error starting hugo: %v", err) } return nil }, Stop: func() error { if cmd == nil { return nil } err := cmd.Process.Signal(os.Interrupt) if err != nil { return fmt.Errorf("error signalling hugo to stop: %v", err) } err = cmd.Wait() if err != nil { return fmt.Errorf("error waiting for hugo to stop: %v", err) return err } es.doc.Close() os.RemoveAll(es.tmpdir) delete(ch.docs, es.filename) return nil }, IdleProcessError: func(err error) { fmt.Println("error processing draft:", err) }, IdleTick: func() error { return ioutil.WriteFile(es.filename, []byte(es.doc.Contents()), 0644) }, ActiveTick: func() error { return ioutil.WriteFile(es.filename, []byte(es.doc.Contents()), 0644) }, } }