package cli import ( "strings" "git.urbach.dev/cli/q/src/compiler" "git.urbach.dev/cli/q/src/config" "git.urbach.dev/cli/q/src/global" "git.urbach.dev/cli/q/src/linker" ) // build parses the arguments and creates a build. func build(args []string) int { b, err := newBuild(args) if err != nil { return exit(err) } env, err := compiler.Compile(b) if err != nil { return exit(err) } if b.Dry { return success } err = linker.WriteFile(b.Executable(), env) return exit(err) } // newBuild creates a new build with the given arguments. func newBuild(args []string) (*config.Build, error) { build := config.New() for i := 0; i < len(args); i++ { switch args[i] { case "-arch": i++ if i >= len(args) { return nil, &ExpectedParameter{Parameter: "arch"} } switch args[i] { case "arm": build.Arch = config.ARM case "x86": build.Arch = config.X86 default: return nil, &InvalidValue{Value: args[i], Parameter: "arch"} } case "-dry": build.Dry = true case "-no-fold": build.Fold = false case "-no-lint": build.Lint(false) case "-no-optimize": build.Optimize(false) case "-no-reorder": build.Reorder = false case "-os": i++ if i >= len(args) { return nil, &ExpectedParameter{Parameter: "os"} } switch args[i] { case "linux": build.OS = config.Linux case "mac": build.OS = config.Mac case "windows": build.OS = config.Windows default: return nil, &InvalidValue{Value: args[i], Parameter: "os"} } default: if strings.HasPrefix(args[i], "-") { return nil, &UnknownParameter{Parameter: args[i]} } build.Files = append(build.Files, args[i]) } } if build.OS == config.UnknownOS { return nil, &InvalidValue{Value: global.OS, Parameter: "os"} } if build.Arch == config.UnknownArch { return nil, &InvalidValue{Value: global.Arch, Parameter: "arch"} } if len(build.Files) == 0 { build.Files = append(build.Files, ".") } return build, nil }