package usecase import ( "context" "fmt" "strings" "gitea.maximumdirect.net/eric/promptkit/internal/domain" ) type resolvedPromptDefinition struct { definition *domain.PromptDefinition hash string } func (r *Runner) resolvePromptDefinition( ctx context.Context, promptID string, promptVersion string, ) (*resolvedPromptDefinition, error) { if strings.TrimSpace(promptID) == "" { return nil, fmt.Errorf("%w: prompt id is required", ErrInvalidRequest) } if r == nil || r.promptDefs == nil { return nil, fmt.Errorf("%w: prompt repository is not configured", ErrPromptLoad) } definition, err := r.promptDefs.GetPromptDefinition(ctx, promptID, promptVersion) if err != nil { return nil, fmt.Errorf("%w: %w", ErrPromptLoad, err) } if definition == nil { return nil, fmt.Errorf("%w: prompt repository returned nil definition", ErrPromptLoad) } hash, err := hashPromptDefinition(definition) if err != nil { return nil, fmt.Errorf("%w: failed to hash prompt definition: %v", ErrPromptLoad, err) } return &resolvedPromptDefinition{definition: definition, hash: hash}, nil } // InspectPrompt resolves one explicit prompt without execution work. func (r *Runner) InspectPrompt( ctx context.Context, promptID string, promptVersion string, ) (*domain.PromptInspection, error) { if strings.TrimSpace(promptID) == "" { return nil, fmt.Errorf("%w: prompt id is required", ErrInvalidRequest) } select { case <-ctx.Done(): return nil, fmt.Errorf("%w: %w", ErrPromptLoad, ctx.Err()) default: } selection, err := r.resolvePromptDefinition(ctx, promptID, promptVersion) if err != nil { return nil, err } inputs := make([]domain.PromptInput, len(selection.definition.Inputs)) copy(inputs, selection.definition.Inputs) return &domain.PromptInspection{ PromptID: selection.definition.ID, PromptVersion: selection.definition.Version, PromptHash: selection.hash, DefaultProfileID: selection.definition.DefaultProfile, Inputs: inputs, OutputContract: selection.definition.Validation, }, nil }