ソースを参照

REST interface was added

Denis V. Dedkov 9 年 前
コミット
01de887adf
1 ファイル変更70 行追加43 行削除
  1. 70 43
      noolite-cli.go

+ 70 - 43
noolite-cli.go

@@ -1,48 +1,39 @@
 package main
 
 import (
+	"errors"
 	"flag"
 	"fmt"
-	"strconv"
 	"github.com/dedkovd/noolite"
 	"net/http"
+	"strings"
+	"strconv"
 )
 
-func main() {
-	channel := flag.Int("channel", -1, "Noolite adapter channel")
-	command := flag.String("command", "", "Command")
-	value := flag.Int("val", 0, "Set value")
-	red := flag.Int("r", 0, "Red channel")
-	green := flag.Int("g", 0, "Green channel")
-	blue := flag.Int("b", 0, "Blue channel")
-
-	http_port := flag.Int("p", -1, "Http port")
-
-	flag.Parse()
-
-	if *channel == -1 {
-		panic("Channel was not set")
+func sendCommand(command string, channel, value, r, g, b int) error {
+	if channel == -1 {
+		return errors.New("Channel was not set")
 	}
 
-	if *command == "" {
-		panic("Command was not set")
+	if command == "" {
+		return errors.New("Command was not set")
 	}
 
 	n, err := noolite.DefaultNooliteAdapter()
 
 	if err != nil {
-		panic(err)
+		return err
 	}
 
 	defer n.Close()
 
-	if *command == "set" {
-		if *value != 0 {
-			err = n.SetBrightnesValue(*channel, *value)
-		} else if *red != 0 || *green != 0 || *blue != 0 {
-			err = n.SetBrightnesValues(*channel, *red, *green, *blue)
+	if command == "set" {
+		if value != 0 {
+			return n.SetBrightnesValue(channel, value)
+		} else if r != 0 || g != 0 || b != 0 {
+			return n.SetBrightnesValues(channel, r, g, b)
 		} else {
-			panic("Need some value")
+			return errors.New("Need some value")
 		}
 	} else {
 		commands := map[string]func(int) error{
@@ -54,37 +45,73 @@ func main() {
 			"invertBrightnes":  n.InvertBrightnes,
 		}
 
-		cmd, ok := commands[*command]
+		cmd, ok := commands[command]
 
 		if !ok {
-			panic("Command not found")
+			return errors.New("Command not found")
 		}
 
-		err = cmd(*channel)
+		return cmd(channel)
 	}
+}
 
-	if err != nil {
-		panic(err)
+func parseParams(path string) (string, int, int, int, int, int) {
+	params := strings.Split(path, "/")[1:]
+
+	command := ""
+	channel := -1
+	value := 0
+	r := 0
+	g := 0
+	b := 0
+
+	command = params[0]
+	if len(params) > 1 {
+		channel, _ = strconv.Atoi(params[1])
+	}
+	if len(params) > 2 {
+		value, _ = strconv.Atoi(params[2])
+	}
+	if len(params) == 5 {
+		r, _ = strconv.Atoi(params[2])
+		g, _ = strconv.Atoi(params[3])
+		b, _ = strconv.Atoi(params[4])
 	}
 
-	if *http_port != -1 {
-		http.HandleFunc("/switch", func(w http.ResponseWriter, r *http.Request) {
-			fmt.Fprintf(w, "%q\n", r.URL.Query())
-			q := r.URL.Query()
-			c, ok := q["c"]
-
-			if !ok {
-				fmt.Fprintf(w, "Channel param required\n")
-			} else {
-				cn, _ := strconv.Atoi(c[0])
-				err = n.Switch(cn)
-			}
+	return command, channel, value, r, g, b
+}
+
+func main() {
+	channel := flag.Int("channel", -1, "Noolite adapter channel")
+	command := flag.String("command", "", "Command")
+	value := flag.Int("val", 0, "Set value")
+	red := flag.Int("r", 0, "Red channel")
+	green := flag.Int("g", 0, "Green channel")
+	blue := flag.Int("b", 0, "Blue channel")
+
+	http_port := flag.Int("p", -1, "Http port")
+
+	flag.Parse()
+
+	if *http_port < 0 {
+		err := sendCommand(*command, *channel, *value, *red, *green, *blue)
+
+		if err != nil {
+			panic(err)
+		}
+	} else {
+		http.HandleFunc("/noolite/", func(w http.ResponseWriter, r *http.Request) {
+			command, channel, _, _,_, _ := parseParams(r.URL.Path[1:])
+			fmt.Fprintf(w, "Command: %q\n", command)
+			fmt.Fprintf(w, "Channel: %d\n", channel)
+
+			err := sendCommand(command, channel, 0, 0, 0, 0)
 
 			if err != nil {
-				fmt.Fprintf(w, "%q\n", err)
+				fmt.Fprintf(w, "Error: %q\n", err)
 			}
 		})
 
-		http.ListenAndServe(":8080", nil)
+		panic(http.ListenAndServe(fmt.Sprintf(":%d", *http_port), nil))
 	}
 }