Feat: Interfaces io.Reader and fmt.Stringer
This commit is contained in:
parent
9ff67c6b84
commit
69b776caea
44
ifaces.go
44
ifaces.go
@ -1,8 +1,11 @@
|
|||||||
package iface
|
package ifupdown
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@ -11,12 +14,43 @@ import (
|
|||||||
|
|
||||||
type Interfaces map[string]*NetworkInterface
|
type Interfaces map[string]*NetworkInterface
|
||||||
|
|
||||||
type poolGroup struct {
|
func (i Interfaces) buf() *pool.Buffer {
|
||||||
Buffers pool.BufferFactory
|
buf := pools.Buffers.Get()
|
||||||
Strs pool.StringFactory
|
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 {
|
type MultiParser struct {
|
||||||
Interfaces map[string]*NetworkInterface
|
Interfaces map[string]*NetworkInterface
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package iface
|
package ifupdown
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@ -19,7 +19,8 @@ iface eth0 inet dhcp
|
|||||||
t.Fatalf("Write failed: %v", err)
|
t.Fatalf("Write failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mp.Parse()
|
var ifaces Interfaces
|
||||||
|
ifaces, err = mp.Parse()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Expected nil error, got: %v", err)
|
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))
|
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"]
|
loIface, ok := mp.Interfaces["lo"]
|
||||||
if !ok || loIface.Name != "lo" {
|
if !ok || loIface.Name != "lo" {
|
||||||
t.Fatalf("Expected to find interface 'lo', got: %+v", loIface)
|
t.Fatalf("Expected to find interface 'lo', got: %+v", loIface)
|
||||||
@ -37,6 +42,11 @@ iface eth0 inet dhcp
|
|||||||
if !ok || eth0Iface.Name != "eth0" {
|
if !ok || eth0Iface.Name != "eth0" {
|
||||||
t.Fatalf("Expected to find interface 'eth0', got: %+v", eth0Iface)
|
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.
|
// Add more test functions here to check other aspects and edge cases.
|
||||||
|
Loading…
Reference in New Issue
Block a user