github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/language.go (about)

     1  package pkg
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/anchore/packageurl-go"
     7  )
     8  
     9  // Language represents a single programming language.
    10  type Language string
    11  
    12  const (
    13  	// the full set of supported programming languages
    14  	UnknownLanguage Language = ""
    15  	CPP             Language = "c++"
    16  	Dart            Language = "dart"
    17  	Dotnet          Language = "dotnet"
    18  	Elixir          Language = "elixir"
    19  	Erlang          Language = "erlang"
    20  	Go              Language = "go"
    21  	Haskell         Language = "haskell"
    22  	Java            Language = "java"
    23  	JavaScript      Language = "javascript"
    24  	PHP             Language = "php"
    25  	Python          Language = "python"
    26  	R               Language = "R"
    27  	Ruby            Language = "ruby"
    28  	Rust            Language = "rust"
    29  	Swift           Language = "swift"
    30  )
    31  
    32  // AllLanguages is a set of all programming languages detected by syft.
    33  var AllLanguages = []Language{
    34  	CPP,
    35  	Dart,
    36  	Dotnet,
    37  	Elixir,
    38  	Erlang,
    39  	Go,
    40  	Haskell,
    41  	Java,
    42  	JavaScript,
    43  	PHP,
    44  	Python,
    45  	R,
    46  	Ruby,
    47  	Rust,
    48  	Swift,
    49  }
    50  
    51  // String returns the string representation of the language.
    52  func (l Language) String() string {
    53  	return string(l)
    54  }
    55  
    56  func LanguageFromPURL(p string) Language {
    57  	purl, err := packageurl.FromString(p)
    58  	if err != nil {
    59  		return UnknownLanguage
    60  	}
    61  
    62  	return LanguageByName(purl.Type)
    63  }
    64  
    65  func LanguageByName(name string) Language {
    66  	switch strings.ToLower(name) {
    67  	case packageurl.TypeMaven, string(purlGradlePkgType), string(JavaPkg), string(Java):
    68  		return Java
    69  	case packageurl.TypeComposer, string(PhpComposerPkg), string(PHP):
    70  		return PHP
    71  	case packageurl.TypeGolang, string(GoModulePkg), string(Go):
    72  		return Go
    73  	case packageurl.TypeNPM, string(JavaScript), "nodejs", "node.js":
    74  		return JavaScript
    75  	case packageurl.TypePyPi, string(Python):
    76  		return Python
    77  	case packageurl.TypeGem, string(Ruby):
    78  		return Ruby
    79  	case purlCargoPkgType, string(RustPkg), string(Rust):
    80  		return Rust
    81  	case packageurl.TypePub, string(DartPubPkg), string(Dart):
    82  		return Dart
    83  	case packageurl.TypeDotnet:
    84  		return Dotnet
    85  	case packageurl.TypeCocoapods, packageurl.TypeSwift, string(CocoapodsPkg), string(SwiftPkg):
    86  		return Swift
    87  	case packageurl.TypeConan, string(CPP):
    88  		return CPP
    89  	case packageurl.TypeHackage, string(Haskell):
    90  		return Haskell
    91  	case packageurl.TypeHex, "beam", "elixir", "erlang":
    92  		// should we support returning multiple languages to support this case?
    93  		// answer: no. We want this to definitively answer "which language does this package represent?"
    94  		// which might not be possible in all cases. See for more context: https://github.com/package-url/purl-spec/pull/178
    95  		return UnknownLanguage
    96  	case packageurl.TypeCran, "r":
    97  		return R
    98  	default:
    99  		return UnknownLanguage
   100  	}
   101  }