Files
indra/pkg/relay/peel.go

96 lines
2.3 KiB
Go

package relay
import (
"fmt"
"github.com/davecgh/go-spew/spew"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
"git-indra.lan/indra-labs/indra/pkg/onion/dxresponse"
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
"git-indra.lan/indra-labs/indra/pkg/onion/hiddenservice"
"git-indra.lan/indra-labs/indra/pkg/onion/magicbytes"
"git-indra.lan/indra-labs/indra/pkg/onion/response"
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
"git-indra.lan/indra-labs/indra/pkg/onion/session"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
switch b[*c:c.Inc(magicbytes.Len)].String() {
case balance.MagicString:
on = &balance.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case confirm.MagicString:
on = &confirm.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case crypt.MagicString:
on = &crypt.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case delay.MagicString:
on = &delay.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case dxresponse.MagicString:
on = &dxresponse.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case exit.MagicString:
on = &exit.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case forward.MagicString:
on = &forward.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case getbalance.MagicString:
on = &getbalance.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case hiddenservice.MagicString:
on = &hiddenservice.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case response.MagicString:
on = &response.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case reverse.MagicString:
on = &reverse.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case session.MagicString:
on = &session.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
default:
e = fmt.Errorf("message magic not found")
log.T.C(func() string {
return fmt.Sprintln(e) + spew.Sdump(b.ToBytes())
})
return
}
return
}