// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#ifndef DICE_CBOR_READER_H_
#define DICE_CBOR_READER_H_

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

struct CborIn {
  const uint8_t* buffer;
  size_t buffer_size;
  size_t cursor;
};

enum CborReadResult {
  CBOR_READ_RESULT_OK,
  // The end of the input was reached before the token was fully read.
  CBOR_READ_RESULT_END,
  // A malformed or unsupported token was found.
  CBOR_READ_RESULT_MALFORMED,
  // The requested token was not found.
  CBOR_READ_RESULT_NOT_FOUND,
};

// Initializes an input stream for reading CBOR tokens.
static inline void CborInInit(const uint8_t* buffer, size_t buffer_size,
                              struct CborIn* in) {
  in->buffer = buffer;
  in->buffer_size = buffer_size;
  in->cursor = 0;
}

// Returns the number of bytes that have been read from the input.
static inline size_t CborInOffset(const struct CborIn* in) {
  return in->cursor;
}

// Returns whether the input stream has been fully consumed.
static inline bool CborInAtEnd(const struct CborIn* in) {
  return in->cursor == in->buffer_size;
}

// These functions read simple CBOR tokens from the input stream. Interpreting
// the greater structure of the data left to the caller and it is expected that
// these functions are just being used to validate and extract data from a known
// structure.
enum CborReadResult CborReadInt(struct CborIn* in, int64_t* val);
enum CborReadResult CborReadUint(struct CborIn* in, uint64_t* val);
enum CborReadResult CborReadBstr(struct CborIn* in, size_t* data_size,
                                 const uint8_t** data);
enum CborReadResult CborReadTstr(struct CborIn* in, size_t* size,
                                 const char** str);
enum CborReadResult CborReadArray(struct CborIn* in, size_t* num_elements);
enum CborReadResult CborReadMap(struct CborIn* in, size_t* num_pairs);
enum CborReadResult CborReadFalse(struct CborIn* in);
enum CborReadResult CborReadTrue(struct CborIn* in);
enum CborReadResult CborReadNull(struct CborIn* in);

// Skips over the next CBOR item in the input. The item may contain nested
// items, in the case of an array or map, and this function will attempt to
// descend and skip all nested items in order to skip the parent item. There is
// a limit on the level of nesting, after which this function will fail with
// CBOR_READ_RESULT_MALFORMED.
#define CBOR_READ_SKIP_STACK_SIZE 10
enum CborReadResult CborReadSkip(struct CborIn* in);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // DICE_CBOR_READER_H_
