github.com/iDigitalFlame/xmt@v0.5.1/data/data_reader.go (about)

     1  // Copyright (C) 2020 - 2023 iDigitalFlame
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU General Public License as published by
     5  // the Free Software Foundation, either version 3 of the License, or
     6  // any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU General Public License
    14  // along with this program.  If not, see <https://www.gnu.org/licenses/>.
    15  //
    16  
    17  package data
    18  
    19  import "io"
    20  
    21  type reader struct {
    22  	_   [0]func()
    23  	r   io.Reader
    24  	buf [8]byte
    25  }
    26  
    27  func (r *reader) Close() error {
    28  	if c, ok := r.r.(io.Closer); ok {
    29  		return c.Close()
    30  	}
    31  	return nil
    32  }
    33  
    34  // NewReader creates a simple Reader struct from the base io.Reader provided.
    35  func NewReader(r io.Reader) Reader {
    36  	return &reader{r: r}
    37  }
    38  func (r *reader) Int() (int, error) {
    39  	v, err := r.Uint64()
    40  	if err != nil {
    41  		return 0, err
    42  	}
    43  	return int(v), nil
    44  }
    45  func (r *reader) Uint() (uint, error) {
    46  	v, err := r.Uint64()
    47  	if err != nil {
    48  		return 0, err
    49  	}
    50  	return uint(v), nil
    51  }
    52  func (r *reader) Bool() (bool, error) {
    53  	v, err := r.Uint8()
    54  	if err != nil {
    55  		return false, err
    56  	}
    57  	return v == 1, nil
    58  }
    59  func (r *reader) Int8() (int8, error) {
    60  	v, err := r.Uint8()
    61  	if err != nil {
    62  		return 0, err
    63  	}
    64  	return int8(v), nil
    65  }
    66  func (r *reader) ReadInt(p *int) error {
    67  	v, err := r.Int()
    68  	if err != nil {
    69  		return err
    70  	}
    71  	*p = v
    72  	return nil
    73  }
    74  func (r *reader) Int16() (int16, error) {
    75  	v, err := r.Uint16()
    76  	if err != nil {
    77  		return 0, err
    78  	}
    79  	return int16(v), nil
    80  }
    81  func (r *reader) Int32() (int32, error) {
    82  	v, err := r.Uint32()
    83  	if err != nil {
    84  		return 0, err
    85  	}
    86  	return int32(v), nil
    87  }
    88  func (r *reader) Int64() (int64, error) {
    89  	v, err := r.Uint64()
    90  	if err != nil {
    91  		return 0, err
    92  	}
    93  	return int64(v), nil
    94  }
    95  func (r *reader) Uint8() (uint8, error) {
    96  	n, err := r.r.Read(r.buf[0:1])
    97  	if err != nil {
    98  		return 0, err
    99  	}
   100  	if n < 1 {
   101  		return 0, io.EOF
   102  	}
   103  	return r.buf[0], nil
   104  }
   105  func (r *reader) Bytes() ([]byte, error) {
   106  	t, err := r.Uint8()
   107  	if err != nil {
   108  		return nil, err
   109  	}
   110  	var l uint64
   111  	switch t {
   112  	case 0:
   113  		return nil, nil
   114  	case 1, 2:
   115  		n, err2 := r.Uint8()
   116  		if err2 != nil {
   117  			return nil, err2
   118  		}
   119  		l = uint64(n)
   120  	case 3, 4:
   121  		n, err2 := r.Uint16()
   122  		if err2 != nil {
   123  			return nil, err2
   124  		}
   125  		l = uint64(n)
   126  	case 5, 6:
   127  		n, err2 := r.Uint32()
   128  		if err2 != nil {
   129  			return nil, err2
   130  		}
   131  		l = uint64(n)
   132  	case 7, 8:
   133  		n, err2 := r.Uint64()
   134  		if err2 != nil {
   135  			return nil, err2
   136  		}
   137  		l = n
   138  	default:
   139  		return nil, ErrInvalidType
   140  	}
   141  	if l == 0 {
   142  		// NOTE(dij): Technically we should return (nil, nil)
   143  		//            But! Our spec states that 0 size should be ID:0
   144  		//            NOT ID:0,SIZE:0. So something made a fucky wucky here.
   145  		return nil, io.ErrUnexpectedEOF
   146  	}
   147  	if l > MaxSlice {
   148  		return nil, ErrTooLarge
   149  	}
   150  	var (
   151  		b = make([]byte, l)
   152  		n int
   153  	)
   154  	if n, err = io.ReadFull(r.r, b); err != nil {
   155  		switch {
   156  		case err == io.EOF:
   157  		case err == ErrLimit:
   158  		default:
   159  			return nil, err
   160  		}
   161  	}
   162  	if uint64(n) != l {
   163  		return b[:n], io.EOF
   164  	}
   165  	return b, nil
   166  }
   167  func (r *reader) ReadUint(p *uint) error {
   168  	v, err := r.Uint()
   169  	if err != nil {
   170  		return err
   171  	}
   172  	*p = v
   173  	return nil
   174  }
   175  func (r *reader) ReadInt8(p *int8) error {
   176  	v, err := r.Int8()
   177  	if err != nil {
   178  		return err
   179  	}
   180  	*p = v
   181  	return nil
   182  }
   183  func (r *reader) ReadBool(p *bool) error {
   184  	v, err := r.Bool()
   185  	if err != nil {
   186  		return err
   187  	}
   188  	*p = v
   189  	return nil
   190  }
   191  func (r *reader) Uint16() (uint16, error) {
   192  	_ = r.buf[1]
   193  	n, err := io.ReadFull(r.r, r.buf[0:2])
   194  	if err != nil {
   195  		return 0, err
   196  	}
   197  	if n < 2 {
   198  		return 0, io.EOF
   199  	}
   200  	return uint16(r.buf[1]) | uint16(r.buf[0])<<8, nil
   201  }
   202  func (r *reader) Uint32() (uint32, error) {
   203  	_ = r.buf[3]
   204  	n, err := io.ReadFull(r.r, r.buf[0:4])
   205  	if err != nil {
   206  		return 0, err
   207  	}
   208  	if n < 4 {
   209  		return 0, io.EOF
   210  	}
   211  	return uint32(r.buf[3]) | uint32(r.buf[2])<<8 | uint32(r.buf[1])<<16 | uint32(r.buf[0])<<24, nil
   212  }
   213  func (r *reader) Uint64() (uint64, error) {
   214  	_ = r.buf[7]
   215  	n, err := io.ReadFull(r.r, r.buf[:])
   216  	if err != nil {
   217  		return 0, err
   218  	}
   219  	if n < 8 {
   220  		return 0, io.EOF
   221  	}
   222  	return uint64(r.buf[7]) | uint64(r.buf[6])<<8 | uint64(r.buf[5])<<16 | uint64(r.buf[4])<<24 |
   223  		uint64(r.buf[3])<<32 | uint64(r.buf[2])<<40 | uint64(r.buf[1])<<48 | uint64(r.buf[0])<<56, nil
   224  }
   225  func (r *reader) ReadInt16(p *int16) error {
   226  	v, err := r.Int16()
   227  	if err != nil {
   228  		return err
   229  	}
   230  	*p = v
   231  	return nil
   232  }
   233  func (r *reader) ReadInt32(p *int32) error {
   234  	v, err := r.Int32()
   235  	if err != nil {
   236  		return err
   237  	}
   238  	*p = v
   239  	return nil
   240  }
   241  func (r *reader) ReadInt64(p *int64) error {
   242  	v, err := r.Int64()
   243  	if err != nil {
   244  		return err
   245  	}
   246  	*p = v
   247  	return nil
   248  }
   249  func (r *reader) ReadUint8(p *uint8) error {
   250  	v, err := r.Uint8()
   251  	if err != nil {
   252  		return err
   253  	}
   254  	*p = v
   255  	return nil
   256  }
   257  func (r *reader) Float32() (float32, error) {
   258  	v, err := r.Uint32()
   259  	if err != nil {
   260  		return 0, nil
   261  	}
   262  	return float32FromInt(v), nil
   263  }
   264  func (r *reader) Float64() (float64, error) {
   265  	v, err := r.Uint64()
   266  	if err != nil {
   267  		return 0, nil
   268  	}
   269  	return float64FromInt(v), nil
   270  }
   271  func (r *reader) ReadBytes(p *[]byte) error {
   272  	v, err := r.Bytes()
   273  	if err != nil {
   274  		return err
   275  	}
   276  	*p = v
   277  	return nil
   278  }
   279  func (r *reader) Read(b []byte) (int, error) {
   280  	return r.r.Read(b)
   281  }
   282  func (r *reader) ReadUint16(p *uint16) error {
   283  	v, err := r.Uint16()
   284  	if err != nil {
   285  		return err
   286  	}
   287  	*p = v
   288  	return nil
   289  }
   290  func (r *reader) ReadUint32(p *uint32) error {
   291  	v, err := r.Uint32()
   292  	if err != nil {
   293  		return err
   294  	}
   295  	*p = v
   296  	return nil
   297  }
   298  func (r *reader) ReadUint64(p *uint64) error {
   299  	v, err := r.Uint64()
   300  	if err != nil {
   301  		return err
   302  	}
   303  	*p = v
   304  	return nil
   305  }
   306  func (r *reader) ReadString(p *string) error {
   307  	v, err := r.StringVal()
   308  	if err != nil {
   309  		return err
   310  	}
   311  	*p = v
   312  	return nil
   313  }
   314  func (r *reader) StringVal() (string, error) {
   315  	b, err := r.Bytes()
   316  	if err != nil {
   317  		return "", err
   318  	}
   319  	return string(b), nil
   320  }
   321  func (r *reader) ReadFloat32(p *float32) error {
   322  	v, err := r.Float32()
   323  	if err != nil {
   324  		return err
   325  	}
   326  	*p = v
   327  	return nil
   328  }
   329  func (r *reader) ReadFloat64(p *float64) error {
   330  	v, err := r.Float64()
   331  	if err != nil {
   332  		return err
   333  	}
   334  	*p = v
   335  	return nil
   336  }