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 }