// Package usecase holds Tapir's application core: the engine that detects new // videos, resolves transcripts, summarizes, and delivers to sinks. It depends // only on internal/ports and internal/domain. // // This is a SCAFFOLD. Methods return ErrNotImplemented so the acceptance tests // in test/acceptance fail RED. Implementing them to make those tests pass is // the first build task (see the build issue). Behaviour is specified in // docs/use-cases/*.feature. package usecase import ( "context" "errors" "gitea.d-ma.be/mathias/tapir/internal/domain" "gitea.d-ma.be/mathias/tapir/internal/ports" ) // ErrNotImplemented marks scaffold methods awaiting implementation. var ErrNotImplemented = errors.New("not implemented") // Engine is the provider- and sink-agnostic core. type Engine struct { Source ports.VideoSource AI ports.Summarizer Sinks []ports.Sink } // NewEngine wires the engine from its ports. func NewEngine(src ports.VideoSource, ai ports.Summarizer, sinks ...ports.Sink) *Engine { return &Engine{Source: src, AI: ai, Sinks: sinks} } // ProcessResult reports what happened for one video. type ProcessResult struct { Video domain.Video Skipped bool Reason string // set when Skipped (e.g. "no transcript") Summary *domain.Summary // nil when Skipped } // ProcessNewVideo runs the core use case for a single video: // resolve transcript -> (summarize -> deliver) | skip. // See docs/use-cases/summarize_new_video.feature. func (e *Engine) ProcessNewVideo(ctx context.Context, v domain.Video) (ProcessResult, error) { return ProcessResult{}, ErrNotImplemented }