func unpickleT(packer intern.Packer, kind int, packed intern.Packed) (T, bool) { switch kind { case chanT: unpickled, ok := packer.UnpackPickler(packed, &SettingT{}) if !ok { return nil, false } setting, ok := unpickled.(*SettingT) return MakeChannel(setting), ok case intT: result, ok := packer.UnpackInt(packed) if !ok { //panic(fmt.Errorf("failed to unpickle int from %v", packed)) } return Int(result), ok case strT: result, ok := packer.UnpackString(packed) return Str(result), ok case quotedT: unpickled, ok := packer.UnpackPickler(packed, &CompoundT{}) if !ok { return nil, false } return Quote(unpickled.(T)), true case wrapperT: return Make("a term that stands in for a wrapped go object that could not be pickled").T(), true case compoundT: result := &CompoundT{} if packed, args, ok := packer.UnpackPair(packed); ok { if args, ok := packer.UnpackList(args); ok { result.args = make([]T, len(args)) for i, arg := range args { unpacked, ok := packer.UnpackPickler(arg, &CompoundT{}) if !ok { return nil, false } result.args[i] = unpacked.(T) } id, ok := unpickleTemplateID(packer, packed) if !ok { return nil, false } result.TemplateID = id return result, true } } } return nil, false }
func (t *Template) Unpickle(packer intern.Packer, pickled intern.Packed) (intern.Pickler, bool) { result := &Template{} if v, parts, ok := packer.UnpackPair(pickled); ok { if v, ok := packer.UnpackInt(v); ok && v == v1Template { if parts, ok := packer.UnpackList(parts); ok { result.Parts = make([]string, len(parts)) for i, part := range parts { if part, ok := packer.UnpackString(part); ok { result.Parts[i] = part } } return result, true } } } return nil, false }