From 2464e70cd20861ff9ac077950673536f4f22c003 Mon Sep 17 00:00:00 2001 From: MDietermann Date: Tue, 14 Apr 2026 14:16:07 +0200 Subject: [PATCH] feat(newproject): add archduino new project scaffolder --- .../subcommands/newproject/assets/default.ino | 9 ++ .../subcommands/newproject/assets/esp32.ino | 22 +++++ .../subcommands/newproject/assets/esp32s3.ino | 9 ++ .../subcommands/newproject/assets/esp8266.ino | 22 +++++ .../subcommands/newproject/assets/mega.ino | 9 ++ .../subcommands/newproject/assets/nano.ino | 9 ++ .../subcommands/newproject/assets/uno.ino | 9 ++ internal/subcommands/newproject/newproject.go | 75 +++++++++++++++++ .../subcommands/newproject/newproject_test.go | 84 +++++++++++++++++++ 9 files changed, 248 insertions(+) create mode 100644 internal/subcommands/newproject/assets/default.ino create mode 100644 internal/subcommands/newproject/assets/esp32.ino create mode 100644 internal/subcommands/newproject/assets/esp32s3.ino create mode 100644 internal/subcommands/newproject/assets/esp8266.ino create mode 100644 internal/subcommands/newproject/assets/mega.ino create mode 100644 internal/subcommands/newproject/assets/nano.ino create mode 100644 internal/subcommands/newproject/assets/uno.ino create mode 100644 internal/subcommands/newproject/newproject.go create mode 100644 internal/subcommands/newproject/newproject_test.go diff --git a/internal/subcommands/newproject/assets/default.ino b/internal/subcommands/newproject/assets/default.ino new file mode 100644 index 0000000..2d0cebb --- /dev/null +++ b/internal/subcommands/newproject/assets/default.ino @@ -0,0 +1,9 @@ +void setup() { + Serial.begin(115200); + while (!Serial) { ; } + Serial.println("Hello from Arduino!"); +} + +void loop() { + // Your code here +} diff --git a/internal/subcommands/newproject/assets/esp32.ino b/internal/subcommands/newproject/assets/esp32.ino new file mode 100644 index 0000000..12bc573 --- /dev/null +++ b/internal/subcommands/newproject/assets/esp32.ino @@ -0,0 +1,22 @@ +#include + +const char* ssid = "YOUR_SSID"; +const char* password = "YOUR_PASS"; + +void setup() { + Serial.begin(115200); + delay(1000); + WiFi.begin(ssid, password); + Serial.print("Connecting to WiFi"); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + Serial.print("Connected! IP: "); + Serial.println(WiFi.localIP()); +} + +void loop() { + delay(1000); +} diff --git a/internal/subcommands/newproject/assets/esp32s3.ino b/internal/subcommands/newproject/assets/esp32s3.ino new file mode 100644 index 0000000..2d0cebb --- /dev/null +++ b/internal/subcommands/newproject/assets/esp32s3.ino @@ -0,0 +1,9 @@ +void setup() { + Serial.begin(115200); + while (!Serial) { ; } + Serial.println("Hello from Arduino!"); +} + +void loop() { + // Your code here +} diff --git a/internal/subcommands/newproject/assets/esp8266.ino b/internal/subcommands/newproject/assets/esp8266.ino new file mode 100644 index 0000000..fb8694c --- /dev/null +++ b/internal/subcommands/newproject/assets/esp8266.ino @@ -0,0 +1,22 @@ +#include + +const char* ssid = "YOUR_SSID"; +const char* password = "YOUR_PASS"; + +void setup() { + Serial.begin(115200); + delay(1000); + WiFi.begin(ssid, password); + Serial.print("Connecting to WiFi"); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + Serial.print("Connected! IP: "); + Serial.println(WiFi.localIP()); +} + +void loop() { + delay(1000); +} diff --git a/internal/subcommands/newproject/assets/mega.ino b/internal/subcommands/newproject/assets/mega.ino new file mode 100644 index 0000000..2d0cebb --- /dev/null +++ b/internal/subcommands/newproject/assets/mega.ino @@ -0,0 +1,9 @@ +void setup() { + Serial.begin(115200); + while (!Serial) { ; } + Serial.println("Hello from Arduino!"); +} + +void loop() { + // Your code here +} diff --git a/internal/subcommands/newproject/assets/nano.ino b/internal/subcommands/newproject/assets/nano.ino new file mode 100644 index 0000000..2d0cebb --- /dev/null +++ b/internal/subcommands/newproject/assets/nano.ino @@ -0,0 +1,9 @@ +void setup() { + Serial.begin(115200); + while (!Serial) { ; } + Serial.println("Hello from Arduino!"); +} + +void loop() { + // Your code here +} diff --git a/internal/subcommands/newproject/assets/uno.ino b/internal/subcommands/newproject/assets/uno.ino new file mode 100644 index 0000000..2d0cebb --- /dev/null +++ b/internal/subcommands/newproject/assets/uno.ino @@ -0,0 +1,9 @@ +void setup() { + Serial.begin(115200); + while (!Serial) { ; } + Serial.println("Hello from Arduino!"); +} + +void loop() { + // Your code here +} diff --git a/internal/subcommands/newproject/newproject.go b/internal/subcommands/newproject/newproject.go new file mode 100644 index 0000000..4f44faa --- /dev/null +++ b/internal/subcommands/newproject/newproject.go @@ -0,0 +1,75 @@ +// Package newproject scaffolds a new Arduino sketch directory. +package newproject + +import ( + "embed" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/MDietermann/ArduinoArchSetup/internal/config" + "github.com/MDietermann/ArduinoArchSetup/internal/platform" +) + +//go:embed assets +var assetsFS embed.FS + +const clangdContent = `CompileFlags: + Add: + - -xc++ + - -std=c++17 +` + +// Run creates a new Arduino project directory. It errors if the project +// directory already exists, if the board is unknown, or if the project name +// contains a path separator. +func Run(cfg config.Config, project, board string) error { + if project == "" { + return fmt.Errorf("project name required") + } + if strings.ContainsAny(project, "/\\") || strings.HasPrefix(project, ".") { + return fmt.Errorf("invalid project name %q", project) + } + + var b *config.Board + var valid []string + for i := range cfg.Scaffolding.Boards { + bp := &cfg.Scaffolding.Boards[i] + valid = append(valid, bp.Name) + if bp.Name == board { + b = bp + } + } + if b == nil { + return fmt.Errorf("unknown board %q; valid: %s", board, strings.Join(valid, ", ")) + } + + if _, err := os.Stat(project); err == nil { + return fmt.Errorf("project directory %q already exists", project) + } + if err := os.MkdirAll(project, 0o755); err != nil { + return err + } + + // Pick .ino template: try