package  ndr 
 
import  ( 
	"errors"  
	"fmt"  
	"reflect"  
	"strconv"  
) 
 
 
 
 
const  ( 
	sizeMethod = "Size"  
) 
 
 
type  RawBytes  interface  { 
	Size (interface {}) int  
} 
 
func  rawBytesSize(parent  reflect .Value , v  reflect .Value ) (int , error ) { 
	sf  := v .MethodByName (sizeMethod ) 
	if  !sf .IsValid () { 
		return  0 , fmt .Errorf ("could not find a method called %s on the implementation of RawBytes" , sizeMethod ) 
	} 
	in  := []reflect .Value {parent } 
	f  := sf .Call (in ) 
	if  f [0 ].Kind () != reflect .Int  { 
		return  0 , errors .New ("the RawBytes size function did not return an integer" ) 
	} 
	return  int (f [0 ].Int ()), nil  
} 
 
func  addSizeToTag(parent  reflect .Value , v  reflect .Value , tag  reflect .StructTag ) (reflect .StructTag , error ) { 
	size , err  := rawBytesSize (parent , v ) 
	if  err  != nil  { 
		return  tag , err  
	} 
	ndrTag  := parseTags (tag ) 
	ndrTag .Map ["size" ] = strconv .Itoa (size ) 
	return  ndrTag .StructTag (), nil  
} 
 
func  (dec  *Decoder ) readRawBytes (v  reflect .Value , tag  reflect .StructTag ) error  { 
	ndrTag  := parseTags (tag ) 
	sizeStr , ok  := ndrTag .Map ["size" ] 
	if  !ok  { 
		return  errors .New ("size tag not available" ) 
	} 
	size , err  := strconv .Atoi (sizeStr ) 
	if  err  != nil  { 
		return  fmt .Errorf ("size not valid: %v" , err ) 
	} 
	b , err  := dec .readBytes (size ) 
	if  err  != nil  { 
		return  err  
	} 
	v .Set (reflect .ValueOf (b ).Convert (v .Type ())) 
	return  nil  
} 
  
The pages are generated with Golds   v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds  is a Go 101  project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1  (reachable from the left QR code) to get the latest news of Golds .