42 lines
1.5 KiB
Go
42 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/declaration"
|
|
"github.com/novox/mesh-host/internal/apply"
|
|
"github.com/novox/mesh-host/internal/link"
|
|
"github.com/novox/mesh-host/internal/store"
|
|
)
|
|
|
|
// applyAndKeep applies a whole declaration the way the carried bundle is applied, and says what came of it as the facts
|
|
// the node says: what the tests of the apply's steps read. The node-engine applies no whole declaration on its own now
|
|
// (novox/hq ADR 0539 §9); this is the test's way to put a machine in a state.
|
|
func applyAndKeep(ctx context.Context, opts options, raw []byte, signed *store.Declared, sched *apply.Scheduler,
|
|
say link.Announce) link.Report {
|
|
declared, err := declaration.Parse(raw)
|
|
if err != nil {
|
|
return link.Report{Refused: err.Error()}
|
|
}
|
|
got := applyModuleHeld(ctx, opts, declared, nil, sched, say)
|
|
if got.Refused != "" {
|
|
return link.Report{Refused: got.Refused}
|
|
}
|
|
held := map[string]bool{}
|
|
for _, h := range got.Updated.Held {
|
|
held[h.ID] = true
|
|
}
|
|
report := factsOf(ctx, opts, declared, got.Updated, got.Outcome, held)
|
|
if signed != nil {
|
|
if err := store.SaveDeclared(store.DeclaredPath(opts.state), *signed); err != nil {
|
|
report.Failed = map[string]string{"keeping the declaration": err.Error()}
|
|
}
|
|
}
|
|
if got.Err != nil {
|
|
report.Failed = map[string]string{"apply": got.Err.Error()}
|
|
}
|
|
report.Failed = withUnanswered(report.Failed, got.Probe)
|
|
report.Unapplied = unapplied(declared, got.Outcome, got.Err)
|
|
return report
|
|
}
|