github.com/anchore/syft@v1.38.2/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  	Lua             Language = "lua"
    25  	OCaml           Language = "ocaml"
    26  	PHP             Language = "php"
    27  	Python          Language = "python"
    28  	R               Language = "R"
    29  	Ruby            Language = "ruby"
    30  	Rust            Language = "rust"
    31  	Swift           Language = "swift"
    32  	Swipl           Language = "swipl"
    33  )
    34  
    35  // AllLanguages is a set of all programming languages detected by syft.
    36  var AllLanguages = []Language{
    37  	CPP,
    38  	Dart,
    39  	Dotnet,
    40  	Elixir,
    41  	Erlang,
    42  	Go,
    43  	Haskell,
    44  	Java,
    45  	JavaScript,
    46  	Lua,
    47  	OCaml,
    48  	PHP,
    49  	Python,
    50  	R,
    51  	Ruby,
    52  	Rust,
    53  	Swift,
    54  	Swipl,
    55  }
    56  
    57  // String returns the string representation of the language.
    58  func (l Language) String() string {
    59  	return string(l)
    60  }
    61  
    62  func LanguageFromPURL(p string) Language {
    63  	purl, err := packageurl.FromString(p)
    64  	if err != nil {
    65  		return UnknownLanguage
    66  	}
    67  
    68  	return LanguageByName(purl.Type)
    69  }
    70  
    71  func LanguageByName(name string) Language {
    72  	switch strings.ToLower(name) {
    73  	case packageurl.TypeMaven, string(purlGradlePkgType), string(JavaPkg), string(Java):
    74  		return Java
    75  	case packageurl.TypeComposer, string(PhpComposerPkg), string(PHP):
    76  		return PHP
    77  	case packageurl.TypeGolang, string(GoModulePkg), string(Go):
    78  		return Go
    79  	case packageurl.TypeNPM, string(JavaScript), "nodejs", "node.js":
    80  		return JavaScript
    81  	case packageurl.TypeLuaRocks, string(Lua):
    82  		return Lua
    83  	case packageurl.TypePyPi, string(Python):
    84  		return Python
    85  	case packageurl.TypeGem, string(Ruby):
    86  		return Ruby
    87  	case purlCargoPkgType, string(RustPkg), string(Rust):
    88  		return Rust
    89  	case packageurl.TypePub, string(DartPubPkg), string(Dart):
    90  		return Dart
    91  	case string(Dotnet), ".net", packageurl.TypeNuget:
    92  		return Dotnet
    93  	case packageurl.TypeCocoapods, packageurl.TypeSwift, string(CocoapodsPkg):
    94  		return Swift
    95  	case "swipl", string(SwiplPackPkg):
    96  		return Swipl
    97  	case "ocaml", string(OpamPkg):
    98  		return OCaml
    99  	case packageurl.TypeConan, string(CPP):
   100  		return CPP
   101  	case packageurl.TypeHackage, string(Haskell):
   102  		return Haskell
   103  	case packageurl.TypeHex, packageurl.TypeOTP, "beam", "elixir", "erlang":
   104  		// should we support returning multiple languages to support this case?
   105  		// answer: no. We want this to definitively answer "which language does this package represent?"
   106  		// which might not be possible in all cases. See for more context: https://github.com/package-url/purl-spec/pull/178
   107  		return UnknownLanguage
   108  	case packageurl.TypeCran, "r":
   109  		return R
   110  	default:
   111  		return UnknownLanguage
   112  	}
   113  }