53 lines
2.1 KiB
Go
53 lines
2.1 KiB
Go
package assign
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// Sent is what the controller sends a node of a module: whether it sends it at all (an open assignment), the build its
|
|
// assignment names, and that build's fingerprint of the new form (empty when its record names none).
|
|
type Sent struct {
|
|
Sends bool
|
|
Build string
|
|
FP string
|
|
}
|
|
|
|
// Compare is the difference between a node's want for a module and what the controller sends it (ADR 0528 clause 4),
|
|
// and whether there is one. want is nil when the assigner wrote none; newest is the module's newest fingerprint and
|
|
// hold the rule that holds the node back from it (Rule 0 when none does). A difference is explained by a rule when the
|
|
// controller sent the newest fingerprint while that rule holds the node's want back; every other is unexplained, said
|
|
// in words, for acceptance test 17 of design 47 to read.
|
|
func Compare(want *delivery.Want, sent Sent, newest string, hold Holding) (delivery.Difference, bool) {
|
|
var d delivery.Difference
|
|
removed := want != nil && want.Removed
|
|
if want != nil && !removed {
|
|
d.Want = want.FP
|
|
}
|
|
d.WantRemoved = removed
|
|
if !sent.Sends {
|
|
if want == nil || removed {
|
|
return delivery.Difference{}, false
|
|
}
|
|
d.Unexplained, d.Words = true, "the node wants "+short(want.FP)+" and the controller sends it nothing"
|
|
return d, true
|
|
}
|
|
d.Sent, d.SentBuild = sent.FP, sent.Build
|
|
switch {
|
|
case sent.FP == "":
|
|
d.Unexplained, d.Words = true, fmt.Sprintf("the build %s the controller sends names no fingerprint of the new form", sent.Build)
|
|
case removed:
|
|
d.Unexplained, d.Words = true, fmt.Sprintf("the want is removed and the controller still sends %s", short(sent.FP))
|
|
case sent.FP == d.Want:
|
|
return delivery.Difference{}, false
|
|
case hold.Rule != 0 && sent.FP == newest:
|
|
d.Rule, d.Words = hold.Rule, fmt.Sprintf("the controller sent %s while %s", short(sent.FP), hold.Words)
|
|
case d.Want == "":
|
|
d.Unexplained, d.Words = true, fmt.Sprintf("the controller sends %s and the node has no want", short(sent.FP))
|
|
default:
|
|
d.Unexplained, d.Words = true, fmt.Sprintf("the controller sends %s and the node wants %s", short(sent.FP), short(d.Want))
|
|
}
|
|
return d, true
|
|
}
|