66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/csv"
|
||
|
|
"fmt"
|
||
|
|
"io"
|
||
|
|
"log"
|
||
|
|
"net/http"
|
||
|
|
"os"
|
||
|
|
|
||
|
|
"github.com/michaeldileo/SafelyYouCodingChallenge/internal/api"
|
||
|
|
"github.com/michaeldileo/SafelyYouCodingChallenge/internal/store"
|
||
|
|
)
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
deviceIDs, err := loadDeviceIDs("devices.csv")
|
||
|
|
if err != nil {
|
||
|
|
log.Fatalf("load devices: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
s := store.New(deviceIDs)
|
||
|
|
log.Printf("loaded %d known devices", len(deviceIDs))
|
||
|
|
|
||
|
|
srv := api.NewServer(s)
|
||
|
|
|
||
|
|
addr := ":6733"
|
||
|
|
fmt.Println("listening on", addr)
|
||
|
|
if err := http.ListenAndServe(addr, srv.Handler()); err != nil {
|
||
|
|
log.Fatal(err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// loadDeviceIDs reads devices.csv (header + one device_id per row).
|
||
|
|
// Lives in main on purpose: startup I/O stays at the process edge;
|
||
|
|
// the store only receives already-parsed IDs.
|
||
|
|
func loadDeviceIDs(path string) ([]store.DeviceID, error) {
|
||
|
|
f, err := os.Open(path)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
defer f.Close()
|
||
|
|
|
||
|
|
r := csv.NewReader(f)
|
||
|
|
|
||
|
|
// Skip header: device_id
|
||
|
|
if _, err := r.Read(); err != nil {
|
||
|
|
return nil, fmt.Errorf("read header: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
var ids []store.DeviceID
|
||
|
|
for {
|
||
|
|
record, err := r.Read()
|
||
|
|
if err == io.EOF {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
if len(record) == 0 || record[0] == "" {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
ids = append(ids, store.DeviceID(record[0]))
|
||
|
|
}
|
||
|
|
return ids, nil
|
||
|
|
}
|