cli/azd/internal/appdetect/config.go (191 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package appdetect
func newConfig(options ...DetectOption) detectConfig {
c := detectConfig{
defaultExcludePatterns: []string{
"**/node_modules",
"**/[Tt]arget",
"**/[Oo]ut",
"**/[Dd]ist",
"**/[Bb]in",
"**/[oO]bj",
"*/.*",
},
}
for _, opt := range options {
c = opt.apply(c)
}
if c.defaultExcludePatterns != nil {
c.ExcludePatterns = append(c.defaultExcludePatterns, c.ExcludePatterns...)
}
setDetectors(&c.languageConfig)
return c
}
func newDirectoryConfig(options ...DetectDirectoryOption) languageConfig {
c := languageConfig{}
for _, opt := range options {
c = opt.applyLang(c)
}
setDetectors(&c)
return c
}
func setDetectors(c *languageConfig) {
languages := map[Language]bool{}
if c.IncludeLanguages != nil {
for _, include := range c.IncludeLanguages {
languages[include] = true
}
} else {
for _, d := range allDetectors {
languages[d.Language()] = true
}
}
if c.ExcludeLanguages != nil {
for _, exclude := range c.ExcludeLanguages {
languages[exclude] = false
}
}
c.detectors = []projectDetector{}
for _, d := range allDetectors {
if languages[d.Language()] {
c.detectors = append(c.detectors, d)
}
}
}
type DetectOption interface {
apply(detectConfig) detectConfig
}
type DetectDirectoryOption interface {
applyLang(languageConfig) languageConfig
}
type LanguageOption interface {
DetectOption
DetectDirectoryOption
}
type detectConfig struct {
languageConfig
// Exclude patterns for directories scanned.
// By default, build and package cache directories like **/dist, **/bin, **/node_modules are automatically excluded.
// Any hidden directories (directories starting with '.') are also excluded.
// Set overrideDefaults in WithExcludePatterns(patterns, overrideDefaults) to choose whether to override defaults.
ExcludePatterns []string
// Internal usage fields
defaultExcludePatterns []string
}
// Config that relates to project languages
type languageConfig struct {
// Project languages to be detected. If unset, all known project languages are included.
IncludeLanguages []Language
// Project languages to be excluded from detection.
ExcludeLanguages []Language
// Internal usage fields
detectors []projectDetector
}
type excludePatternsOptions struct {
patterns []string
overrideDefaults bool
}
func (o *excludePatternsOptions) apply(c detectConfig) detectConfig {
if o.overrideDefaults {
c.defaultExcludePatterns = nil
}
c.ExcludePatterns = append(c.ExcludePatterns, o.patterns...)
return c
}
func WithExcludePatterns(patterns []string, overrideDefaults bool) DetectOption {
return &excludePatternsOptions{patterns, overrideDefaults}
}
type includePython struct {
}
func (o *includePython) apply(c detectConfig) detectConfig {
c.IncludeLanguages = append(c.IncludeLanguages, Python)
return c
}
func (o *includePython) applyLang(c languageConfig) languageConfig {
c.IncludeLanguages = append(c.IncludeLanguages, Python)
return c
}
func WithPython() LanguageOption {
return &includePython{}
}
type excludePython struct {
}
func (o *excludePython) apply(c detectConfig) detectConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, Python)
return c
}
func (o *excludePython) applyLang(c languageConfig) languageConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, Python)
return c
}
func WithoutPython() LanguageOption {
return &excludePython{}
}
type includeDotNet struct {
}
func (o *includeDotNet) apply(c detectConfig) detectConfig {
c.IncludeLanguages = append(c.IncludeLanguages, DotNet)
return c
}
func (o *includeDotNet) applyLang(c languageConfig) languageConfig {
c.IncludeLanguages = append(c.IncludeLanguages, DotNet)
return c
}
func WithDotNet() LanguageOption {
return &includeDotNet{}
}
type excludeDotNet struct {
}
func (o *excludeDotNet) apply(c detectConfig) detectConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, DotNet)
return c
}
func (o *excludeDotNet) applyLang(c languageConfig) languageConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, DotNet)
return c
}
func WithoutDotNet() LanguageOption {
return &excludeDotNet{}
}
type includeJava struct {
}
func (o *includeJava) apply(c detectConfig) detectConfig {
c.IncludeLanguages = append(c.IncludeLanguages, Java)
return c
}
func (o *includeJava) applyLang(c languageConfig) languageConfig {
c.IncludeLanguages = append(c.IncludeLanguages, Java)
return c
}
func WithJava() LanguageOption {
return &includeJava{}
}
type excludeJava struct {
}
func (o *excludeJava) apply(c detectConfig) detectConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, Java)
return c
}
func (o *excludeJava) applyLang(c languageConfig) languageConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, Java)
return c
}
func WithoutJava() LanguageOption {
return &excludeJava{}
}
type includeJavaScript struct {
}
func (o *includeJavaScript) apply(c detectConfig) detectConfig {
c.IncludeLanguages = append(c.IncludeLanguages, JavaScript)
return c
}
func (o *includeJavaScript) applyLang(c languageConfig) languageConfig {
c.IncludeLanguages = append(c.IncludeLanguages, JavaScript)
return c
}
func WithJavaScript() LanguageOption {
return &includeJavaScript{}
}
type excludeJavaScript struct {
}
func (o *excludeJavaScript) apply(c detectConfig) detectConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, JavaScript)
return c
}
func (o *excludeJavaScript) applyLang(c languageConfig) languageConfig {
c.ExcludeLanguages = append(c.ExcludeLanguages, JavaScript)
return c
}
func WithoutJavaScript() LanguageOption {
return &excludeJavaScript{}
}