package policy import ( "errors" "net" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" ) type Conn struct { RemoteAddr starlark.String ClientIP starlark.String Meta *starlarkstruct.Struct } func (c Conn) String() string { return "" } func (c Conn) Type() string { return "Conn" } func (c Conn) Freeze() { c.Meta.Freeze() } func (c Conn) Truth() starlark.Bool { return true } func (c Conn) Hash() (uint32, error) { return 0, errors.New("unhashable") } func (c Conn) Attr(name string) (starlark.Value, error) { switch name { case "remote_addr": return c.RemoteAddr, nil case "client_ip": return c.ClientIP, nil case "meta": return c.Meta, nil } return nil, nil } func (c Conn) AttrNames() []string { return []string{"remote_addr", "client_ip", "meta"} } func ConnToStarlark(conn net.Conn) Conn { remoteAddr := conn.RemoteAddr().String() var clientIP string if tcpAddr, ok := conn.RemoteAddr().(*net.TCPAddr); ok { clientIP = tcpAddr.IP.String() } else { clientIP = remoteAddr } return Conn{ RemoteAddr: starlark.String(remoteAddr), ClientIP: starlark.String(clientIP), Meta: starlarkstruct.FromStringDict(starlark.None, starlark.StringDict{}), } }