Feat: Interfaces io.Reader and fmt.Stringer

This commit is contained in:
kayos@tcp.direct 2023-12-02 00:21:18 -08:00
parent 9ff67c6b84
commit 69b776caea
Signed by: kayos
GPG Key ID: 4B841471B4BEE979
2 changed files with 51 additions and 7 deletions

View File

@ -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

View File

@ -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.