93 lines
2.8 KiB
Go
93 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
stdio "git.novox.be/novox/mesh-sdk/go"
|
|
)
|
|
|
|
func main() {
|
|
if err := stdio.Serve("", tools(os.Getenv("SCAN_SETTINGS"), emit, time.Now)); err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// emit says scan.added on the bus, under the file's sha256 as its message id.
|
|
func emit(body map[string]any, id string) error {
|
|
return stdio.Emit(EventAdded, body, stdio.EmitOptions{MessageID: id})
|
|
}
|
|
|
|
// tools are the three tools. The settings are read at each call, so a changed config value is the next
|
|
// call's.
|
|
func tools(settingsFile string, say Emitter, now func() time.Time) []stdio.Tool {
|
|
service := func() (*Service, error) {
|
|
s, err := LoadSettings(settingsFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Service{Settings: s, Node: os.Getenv("MESH_NODE"), Now: now, Emit: say}, nil
|
|
}
|
|
return []stdio.Tool{
|
|
{
|
|
Name: "scan_now",
|
|
Description: "Scan the glass of the configured network scanner, cut the document out of the platen's white, " +
|
|
"file it as a one-page PDF in the scan folder and say scan.added on the bus. Answers the event's body: " +
|
|
"the file's path, its size and sha256, its real size in millimetres, the resolution the scanner " +
|
|
"really gave, whether it was cropped. The image itself is never sent.",
|
|
Run: func(map[string]any) (any, error) {
|
|
s, err := service()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return s.ScanNow(context.Background())
|
|
},
|
|
},
|
|
{
|
|
Name: "scan_status",
|
|
Description: "Whether the configured scanner answers, and what it is doing: its state (Idle or Processing) " +
|
|
"and its document feeder's state. A scanner that does not answer is said as answers false with why. Read-only.",
|
|
Run: func(map[string]any) (any, error) {
|
|
s, err := service()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
|
|
defer cancel()
|
|
return s.ScanStatus(ctx)
|
|
},
|
|
},
|
|
{
|
|
Name: "scan_list",
|
|
Description: "The newest scans filed in the scan folder, newest first, with their size and time. Read-only.",
|
|
Input: map[string]any{
|
|
"type": "object",
|
|
"properties": map[string]any{
|
|
"limit": map[string]any{"type": "integer", "description": "at most this many scans (default 20)"},
|
|
},
|
|
},
|
|
Run: func(args map[string]any) (any, error) {
|
|
limit := 20
|
|
if v, ok := args["limit"]; ok {
|
|
f, isNum := v.(float64)
|
|
if i, isInt := v.(int); isInt {
|
|
f, isNum = float64(i), true
|
|
}
|
|
if !isNum || f < 1 || f > 1000 || f != float64(int(f)) {
|
|
return nil, fmt.Errorf("limit is a whole number from 1 to 1000")
|
|
}
|
|
limit = int(f)
|
|
}
|
|
s, err := service()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return s.ScanList(limit)
|
|
},
|
|
},
|
|
}
|
|
}
|