| | | 1 | | package app |
| | | 2 | | |
| | | 3 | | import ( |
| | | 4 | | "context" |
| | | 5 | | "fmt" |
| | | 6 | | |
| | | 7 | | "github.com/jedi-knights/go-semantic-release/internal/domain" |
| | | 8 | | "github.com/jedi-knights/go-semantic-release/internal/ports" |
| | | 9 | | ) |
| | | 10 | | |
| | | 11 | | // ProjectDetector orchestrates project discovery. |
| | | 12 | | type ProjectDetector struct { |
| | | 13 | | discoverer ports.ProjectDiscoverer |
| | | 14 | | logger ports.Logger |
| | | 15 | | } |
| | | 16 | | |
| | | 17 | | // NewProjectDetector creates a project detector. |
| | | 18 | | func NewProjectDetector(discoverer ports.ProjectDiscoverer, logger ports.Logger) *ProjectDetector { |
| | | 19 | | return &ProjectDetector{discoverer: discoverer, logger: logger} |
| | | 20 | | } |
| | | 21 | | |
| | | 22 | | // Detect discovers projects in the repository. |
| | 3 | 23 | | func (d *ProjectDetector) Detect(ctx context.Context, rootPath string) ([]domain.Project, error) { |
| | 3 | 24 | | projects, err := d.discoverer.Discover(ctx, rootPath) |
| | 1 | 25 | | if err != nil { |
| | 1 | 26 | | return nil, fmt.Errorf("discovering projects: %w", err) |
| | 1 | 27 | | } |
| | | 28 | | |
| | 1 | 29 | | if len(projects) == 0 { |
| | 1 | 30 | | d.logger.Info("no projects discovered, using root project") |
| | 1 | 31 | | return []domain.Project{{ |
| | 1 | 32 | | Name: "", |
| | 1 | 33 | | Path: ".", |
| | 1 | 34 | | Type: domain.ProjectTypeRoot, |
| | 1 | 35 | | }}, nil |
| | 1 | 36 | | } |
| | | 37 | | |
| | 1 | 38 | | d.logger.Info("discovered projects", "count", len(projects)) |
| | 1 | 39 | | for _, p := range projects { |
| | 2 | 40 | | d.logger.Debug("project", "name", p.Name, "path", p.Path, "type", p.Type) |
| | 2 | 41 | | } |
| | 1 | 42 | | return projects, nil |
| | | 43 | | } |