@@ -33,7 +33,6 @@ import (
33
33
"fmt"
34
34
"net/url"
35
35
"os"
36
- "regexp"
37
36
"time"
38
37
39
38
discovery "github.com/arduino/board-discovery"
@@ -47,10 +46,6 @@ import (
47
46
"github.com/spf13/cobra"
48
47
)
49
48
50
- var validSerialBoardURIRegexp = regexp .MustCompile ("(serial|tty)://.+" )
51
- var validNetworkBoardURIRegexp = regexp .MustCompile ("(http(s)?|(tc|ud)p)://[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:[0-9]{1,5}" )
52
- var validFQBN = regexp .MustCompile (".+:.+:.+" )
53
-
54
49
func initAttachCommand () * cobra.Command {
55
50
attachCommand := & cobra.Command {
56
51
Use : "attach <port>|<FQBN> [sketchPath]" ,
@@ -82,7 +77,8 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
82
77
os .Exit (commands .ErrGeneric )
83
78
}
84
79
85
- if ! validFQBN .MatchString (boardURI ) && boardURI [:6 ] != "serial" {
80
+ fqbn , err := cores .ParseFQBN (boardURI )
81
+ if err != nil && boardURI [:6 ] != "serial" {
86
82
boardURI = "serial://" + boardURI
87
83
}
88
84
@@ -92,30 +88,31 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
92
88
os .Exit (commands .ErrCoreConfig )
93
89
}
94
90
95
- deviceURI , err := url .Parse (boardURI )
96
- if err != nil {
97
- formatter .PrintError (err , "The provided Device URL is not in a valid format." )
98
- os .Exit (commands .ErrBadCall )
99
- }
100
-
101
- var findBoardFunc func (* packagemanager.PackageManager , * discovery.Monitor , * url.URL ) * cores.Board
102
- var Type string
103
-
104
- fqbn := ""
105
- if validFQBN .MatchString (boardURI ) {
106
- fqbn = boardURI
107
- } else if validSerialBoardURIRegexp .MatchString (boardURI ) {
108
- findBoardFunc = findSerialConnectedBoard
109
- Type = "serial"
110
- } else if validNetworkBoardURIRegexp .MatchString (boardURI ) {
111
- findBoardFunc = findNetworkConnectedBoard
112
- Type = "network"
91
+ if fqbn != nil {
92
+ sketch .Metadata .CPU = sketches.MetadataCPU {
93
+ Fqbn : fqbn .String (),
94
+ }
113
95
} else {
114
- formatter .PrintErrorMessage ("Invalid device port type provided. Accepted types are: serial://, tty://, http://, https://, tcp://, udp://." )
115
- os .Exit (commands .ErrBadCall )
116
- }
96
+ deviceURI , err := url .Parse (boardURI )
97
+ if err != nil {
98
+ formatter .PrintError (err , "The provided Device URL is not in a valid format." )
99
+ os .Exit (commands .ErrBadCall )
100
+ }
101
+
102
+ var findBoardFunc func (* packagemanager.PackageManager , * discovery.Monitor , * url.URL ) * cores.Board
103
+ var Type string
104
+ switch deviceURI .Scheme {
105
+ case "serial" , "tty" :
106
+ findBoardFunc = findSerialConnectedBoard
107
+ Type = "serial"
108
+ case "http" , "https" , "tcp" , "udp" :
109
+ findBoardFunc = findNetworkConnectedBoard
110
+ Type = "network"
111
+ default :
112
+ formatter .PrintErrorMessage ("Invalid device port type provided. Accepted types are: serial://, tty://, http://, https://, tcp://, udp://." )
113
+ os .Exit (commands .ErrBadCall )
114
+ }
117
115
118
- if fqbn == "" {
119
116
duration , err := time .ParseDuration (attachFlags .searchTimeout )
120
117
if err != nil {
121
118
logrus .WithError (err ).Warnf ("Invalid interval `%s` provided, using default (5s)." , attachFlags .searchTimeout )
@@ -139,17 +136,13 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
139
136
Name : board .Name (),
140
137
Type : Type ,
141
138
}
142
- fqbn = board .FQBN ()
143
- } else {
144
- sketch .Metadata .CPU = sketches.MetadataCPU {
145
- Fqbn : fqbn ,
146
- }
147
139
}
140
+
148
141
err = sketch .ExportMetadata ()
149
142
if err != nil {
150
143
formatter .PrintError (err , "Cannot export sketch metadata." )
151
144
}
152
- formatter .PrintResult ("Selected fqbn: " + fqbn )
145
+ formatter .PrintResult ("Selected fqbn: " + sketch . Metadata . CPU . Fqbn )
153
146
}
154
147
155
148
// FIXME: Those should probably go in a "BoardManager" pkg or something
0 commit comments