41 lines
1.5 KiB
Go
41 lines
1.5 KiB
Go
package application
|
|
|
|
import (
|
|
"context"
|
|
|
|
"git.cin.su/m/Assistant/contracts/epistemics"
|
|
domain "git.cin.su/m/Assistant/modules/epistemics/domain"
|
|
)
|
|
|
|
type TruthBundleStore interface {
|
|
SaveTruthBundle(context.Context, epistemics.TruthBundle, int64) error
|
|
}
|
|
|
|
// EvaluateAndPersist evaluates only supplied immutable connector evidence and
|
|
// persists the exact source chain used by each candidate. It never performs a
|
|
// network fetch and never promotes a belief to verified state.
|
|
func EvaluateAndPersist(ctx context.Context, request epistemics.ResearchEvaluationRequest, store TruthBundleStore, evaluatedAtUnixMillis int64) (epistemics.ResearchResult, error) {
|
|
result, err := (ResearchService{Connector: staticConnector{candidates: request.Candidates}}).Evaluate(ctx, request.Plan, evaluatedAtUnixMillis)
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
for _, candidate := range request.Candidates {
|
|
bundle, err := domain.CompileObservedClaim(candidate.Source, candidate.Snapshot, candidate.Excerpt, candidate.Statement, candidate.Snapshot.CapturedAtUnixMillis, candidate.Conflict)
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
if err := store.SaveTruthBundle(ctx, bundle, evaluatedAtUnixMillis); err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
type staticConnector struct {
|
|
candidates []epistemics.ResearchCandidate
|
|
}
|
|
|
|
func (c staticConnector) Collect(context.Context, epistemics.ResearchPlan) ([]epistemics.ResearchCandidate, error) {
|
|
return c.candidates, nil
|
|
}
|