code: func (d DecrypterProto) decryptStruct(object interface{}, path []string, decryptFunc DecryptFunc) error {
  	v, ok := object.(reflect.Value)
  	if !ok {
  		v = reflect.ValueOf(object)
  	}
  
  	for pathIndex, key := range path {
  		if v.Kind() == reflect.Ptr {
  			v = v.Elem()
  		}
  
  		if v.Kind() == reflect.Struct {
  			v = v.FieldByName(key)
  		}
  
  		if v.Kind() == reflect.Slice {
  			for i := 0; i < v.Len(); i++ {
  				val := v.Index(i)
  				kind := val.Kind()
  				index := pathIndex
  
  				if kind == reflect.Struct || kind == reflect.Ptr {
  					index++
  				}
  
  				if err := d.decryptStruct(val, path[index:], decryptFunc); err != nil {
  					return err
  				}
  			}
  
  			return nil
  		}
  
  		if v.Kind() == reflect.String {
  			val := v.String()
  			if val == "" {
  				continue
  			}
  
  			decoded, err := base64.URLEncoding.DecodeString(val)
  			if err != nil {
  				return err
  			}
  
  			decrypted, err := decryptFunc(decoded)
  			if err != nil {
  				return err
  			}
  
  			v.SetString(string(decrypted))
  			return nil
  		}
  
  		return fmt.Errorf("failed to process path on %v", v)
  	}
  
  	return nil
  }
docs: // decryptStruct recursively tries to decrypt fields in object on provided path using provided decryptFunc