diff --git a/ifaces.go b/ifaces.go index 9aaa460..f9437fd 100644 --- a/ifaces.go +++ b/ifaces.go @@ -1,8 +1,11 @@ -package iface +package ifupdown import ( "bufio" + "encoding/json" + "errors" "fmt" + "io" "strings" "sync" @@ -11,12 +14,43 @@ import ( type Interfaces map[string]*NetworkInterface -type poolGroup struct { - Buffers pool.BufferFactory - Strs pool.StringFactory +func (i Interfaces) buf() *pool.Buffer { + buf := pools.Buffers.Get() + for _, iface := range i { + err := iface.write(func(s string) { buf.MustWrite([]byte(s)) }) + if err != nil && !errors.Is(err, io.EOF) { + panic(err) + } + buf.MustWrite([]byte("\n")) + } + return buf } -var pools = poolGroup{Buffers: pool.NewBufferFactory(), Strs: pool.NewStringFactory()} +func (i Interfaces) Read(p []byte) (int, error) { + buf := i.buf() + defer pools.Buffers.MustPut(buf) + return buf.Read(p) +} + +func (i Interfaces) String() string { + buf := i.buf() + defer pools.Buffers.MustPut(buf) + return buf.String() +} + +func (i Interfaces) UnmarshalJSON(data []byte) error { + var ifaces map[string]*NetworkInterface + if err := json.Unmarshal(data, &ifaces); err != nil { + return err + } + for name, iface := range ifaces { + iface.Name = name + iface.allocated = true + i[name] = iface + } + + return nil +} type MultiParser struct { Interfaces map[string]*NetworkInterface diff --git a/ifaces_test.go b/ifaces_test.go index dc28f74..a7743a8 100644 --- a/ifaces_test.go +++ b/ifaces_test.go @@ -1,4 +1,4 @@ -package iface +package ifupdown import ( "testing" @@ -19,7 +19,8 @@ iface eth0 inet dhcp t.Fatalf("Write failed: %v", err) } - err = mp.Parse() + var ifaces Interfaces + ifaces, err = mp.Parse() if err != nil { t.Fatalf("Expected nil error, got: %v", err) } @@ -28,6 +29,10 @@ iface eth0 inet dhcp t.Fatalf("Expected 2 interfaces, got: %d", len(mp.Interfaces)) } + if len(mp.Interfaces) != len(ifaces) { + t.Fatalf("Expected %d interfaces, got: %d", len(mp.Interfaces), len(ifaces)) + } + loIface, ok := mp.Interfaces["lo"] if !ok || loIface.Name != "lo" { t.Fatalf("Expected to find interface 'lo', got: %+v", loIface) @@ -37,6 +42,11 @@ iface eth0 inet dhcp if !ok || eth0Iface.Name != "eth0" { t.Fatalf("Expected to find interface 'eth0', got: %+v", eth0Iface) } + for _, iface := range ifaces { + if err = iface.Validate(); err != nil { + t.Fatalf("Expected nil error, got: %v", err) + } + } } // Add more test functions here to check other aspects and edge cases.