1
2
3
4
5 package gover
6
7 import (
8 "cmd/go/internal/base"
9 "context"
10 "errors"
11 "fmt"
12 "strings"
13 )
14
15
16
17
18
19
20
21
22
23
24 func FromToolchain(name string) string {
25 if strings.ContainsAny(name, "\\/") {
26
27
28
29 return ""
30 }
31
32 var v string
33 if strings.HasPrefix(name, "go") {
34 v = name[2:]
35 } else {
36 return ""
37 }
38
39 if i := strings.IndexAny(v, " \t-"); i >= 0 {
40 v = v[:i]
41 }
42 if !IsValid(v) {
43 return ""
44 }
45 return v
46 }
47
48 func maybeToolchainVersion(name string) string {
49 if IsValid(name) {
50 return name
51 }
52 return FromToolchain(name)
53 }
54
55
56
57 var Startup struct {
58 GOTOOLCHAIN string
59 AutoFile string
60 AutoGoVersion string
61 AutoToolchain string
62 }
63
64
65 type TooNewError struct {
66 What string
67 GoVersion string
68 Toolchain string
69 }
70
71 func (e *TooNewError) Error() string {
72 var explain string
73 if Startup.GOTOOLCHAIN != "" && Startup.GOTOOLCHAIN != "auto" {
74 explain = "; GOTOOLCHAIN=" + Startup.GOTOOLCHAIN
75 }
76 if Startup.AutoFile != "" && (Startup.AutoGoVersion != "" || Startup.AutoToolchain != "") {
77 explain += fmt.Sprintf("; %s sets ", base.ShortPath(Startup.AutoFile))
78 if Startup.AutoToolchain != "" {
79 explain += "toolchain " + Startup.AutoToolchain
80 } else {
81 explain += "go " + Startup.AutoGoVersion
82 }
83 }
84 return fmt.Sprintf("%v requires go >= %v (running go %v%v)", e.What, e.GoVersion, Local(), explain)
85 }
86
87 var ErrTooNew = errors.New("module too new")
88
89 func (e *TooNewError) Is(err error) bool {
90 return err == ErrTooNew
91 }
92
93
94
95 type Switcher interface {
96 Error(err error)
97 Switch(ctx context.Context)
98 }
99
View as plain text