Gisle Aune
3 years ago
2 changed files with 159 additions and 2 deletions
@ -0,0 +1,157 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"encoding/json" |
||||
|
"fmt" |
||||
|
"git.aiterp.net/lucifer/new-server/models" |
||||
|
"io" |
||||
|
"sort" |
||||
|
"strings" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func WriteDeviceInfo(w io.Writer, devices []models.Device, fields []string) { |
||||
|
if len(fields) == 1 && fields[0] == "all" { |
||||
|
fields = allFields |
||||
|
} else { |
||||
|
fields = append(fields[:0:0], fields...) |
||||
|
for i, field := range fields { |
||||
|
if aliased, ok := fieldAliases[field]; ok { |
||||
|
fields[i] = aliased |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
length := 0 |
||||
|
for _, field := range fields { |
||||
|
if mlFields[field] { |
||||
|
continue |
||||
|
} |
||||
|
|
||||
|
if len(field) > length { |
||||
|
length = len(field) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
for i, device := range devices { |
||||
|
if i > 0 { |
||||
|
fmt.Println() |
||||
|
} |
||||
|
|
||||
|
for _, field := range fields { |
||||
|
if formatter, ok := fieldFormatters[field]; ok { |
||||
|
_, _ = fmt.Fprintf(w, "%-*s %s\n", length+1, field+":", formatter(&device)) |
||||
|
} else { |
||||
|
_, _ = fmt.Fprintf(w, "%-*s (unknown field)\n", length+1, field+":") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var allFields = []string{ |
||||
|
"id", "name", "icon", "bridgeId", "tags", "buttonNames", |
||||
|
"power", "color", "intensity", "temperature", |
||||
|
"internalId", "sceneAssignment", "userProperties", "driverProperties", |
||||
|
} |
||||
|
|
||||
|
var mlFields = map[string]bool{ |
||||
|
"sceneAssignment": true, |
||||
|
"userProperties": true, |
||||
|
"driverProperties": true, |
||||
|
} |
||||
|
|
||||
|
var fieldFormatters = map[string]func(d *models.Device) string{ |
||||
|
"id": func(d *models.Device) string { return fmt.Sprint(d.ID) }, |
||||
|
"internalId": func(d *models.Device) string { return d.InternalID }, |
||||
|
"name": func(d *models.Device) string { return d.Name }, |
||||
|
"icon": func(d *models.Device) string { return d.Icon }, |
||||
|
"bridgeId": func(d *models.Device) string { return fmt.Sprint(d.BridgeID) }, |
||||
|
"tags": func(d *models.Device) string { return strings.Join(d.Tags, ", ") }, |
||||
|
"buttonNames": func(d *models.Device) string { return strings.Join(d.ButtonNames, ", ") }, |
||||
|
"power": func(d *models.Device) string { return fmt.Sprint(d.State.Power) }, |
||||
|
"color": func(d *models.Device) string { return d.State.Color.String() }, |
||||
|
"intensity": func(d *models.Device) string { return fmt.Sprint(d.State.Intensity) }, |
||||
|
"temperature": func(d *models.Device) string { return fmt.Sprint(d.State.Temperature) }, |
||||
|
|
||||
|
"sceneAssignment": func(d *models.Device) string { |
||||
|
str := &strings.Builder{} |
||||
|
str.Grow(64) |
||||
|
for _, scene := range d.SceneAssignments { |
||||
|
_, _ = fmt.Fprintf(str, "\n - id: %d\n", scene.SceneID) |
||||
|
_, _ = fmt.Fprintf(str, " duration: %d\n", scene.DurationMS) |
||||
|
_, _ = fmt.Fprintf(str, " group: %s\n", scene.Group) |
||||
|
_, _ = fmt.Fprintf(str, " startTime: %s", scene.StartTime.Format(time.RFC3339)) |
||||
|
} |
||||
|
if len(d.SceneAssignments) == 0 { |
||||
|
str.Reset() |
||||
|
str.WriteString("(none)") |
||||
|
} |
||||
|
|
||||
|
return str.String() |
||||
|
}, |
||||
|
|
||||
|
"userProperties": func(d *models.Device) string { |
||||
|
str := &strings.Builder{} |
||||
|
str.Grow(64) |
||||
|
str.WriteString("\n") |
||||
|
keys := make([]string, 0, len(d.UserProperties)) |
||||
|
for key := range d.UserProperties { |
||||
|
keys = append(keys, key) |
||||
|
} |
||||
|
sort.Strings(keys) |
||||
|
for _, key := range keys { |
||||
|
_, _ = fmt.Fprintf(str, " %s: %s\n", key, d.UserProperties[key]) |
||||
|
} |
||||
|
if len(d.UserProperties) == 0 { |
||||
|
str.Reset() |
||||
|
str.WriteString("(none)") |
||||
|
} |
||||
|
|
||||
|
return str.String() |
||||
|
}, |
||||
|
|
||||
|
"driverProperties": func(d *models.Device) string { |
||||
|
str := &strings.Builder{} |
||||
|
str.Grow(256) |
||||
|
str.WriteString("\n") |
||||
|
keys := make([]string, 0, len(d.DriverProperties)) |
||||
|
for key := range d.DriverProperties { |
||||
|
keys = append(keys, key) |
||||
|
} |
||||
|
sort.Strings(keys) |
||||
|
for _, key := range keys { |
||||
|
j, _ := json.Marshal(d.DriverProperties[key]) |
||||
|
_, _ = fmt.Fprintf(str, " %s: %s\n", key, string(j)) |
||||
|
} |
||||
|
if len(d.DriverProperties) == 0 { |
||||
|
str.Reset() |
||||
|
str.WriteString("(none)") |
||||
|
} |
||||
|
|
||||
|
return str.String() |
||||
|
}, |
||||
|
|
||||
|
"capabilities": func(d *models.Device) string { |
||||
|
capStr := make([]string, len(d.Capabilities)) |
||||
|
for i := range d.Capabilities { |
||||
|
capStr[i] = string(d.Capabilities[i]) |
||||
|
} |
||||
|
return strings.Join(capStr, ", ") |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
var fieldAliases = map[string]string{ |
||||
|
"bridge": "bridgeId", |
||||
|
"buttons": "buttonNames", |
||||
|
"internal": "internalId", |
||||
|
"caps": "capabilities", |
||||
|
"cap": "capabilities", |
||||
|
"userprops": "userProperties", |
||||
|
"uprops": "userProperties", |
||||
|
"driverprops": "driverProperties", |
||||
|
"dprops": "driverProperties", |
||||
|
"internalid": "internalId", |
||||
|
"bridgeid": "bridgeId", |
||||
|
"buttonnames": "buttonNames", |
||||
|
"scene": "sceneAssignment", |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue