#
#  Copyright (C) 2019 Bloomberg L.P.
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2 of the License, or (at your option) any later version.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
#  Authors:
#        Benjamin Schubert <bschubert@bloomberg.net>

# Documentation for each class and method here can be found in the adjacent
# implementation file (_yaml.pyx)

cdef class Node:

    cdef int file_index
    cdef int line
    cdef int column

    # Public Methods
    cpdef Node clone(self)
    cpdef ProvenanceInformation get_provenance(self)
    cpdef object strip_node_info(self)

    # Private Methods used in BuildStream
    cpdef void _assert_fully_composited(self) except *

    # Protected Methods
    cdef void _compose_on(self, str key, MappingNode target, list path) except *
    cdef bint _is_composite_list(self) except *
    cdef bint _shares_position_with(self, Node target)
    cdef bint _walk_find(self, Node target, list path) except *


cdef class MappingNode(Node):
    cdef dict value

    # Public Methods
    cpdef bint get_bool(self, str key, default=*) except *
    cpdef object get_enum(self, str key, object constraint, object default=*)
    cpdef object get_int(self, str key, default=*)
    cpdef MappingNode get_mapping(self, str key, default=*)
    cpdef Node get_node(self, str key, list allowed_types=*, bint allow_none=*)
    cpdef ScalarNode get_scalar(self, str key, default=*)
    cpdef SequenceNode get_sequence(self, str key, object default=*, list allowed_types=*)
    cpdef str get_str(self, str key, object default=*)
    cpdef list get_str_list(self, str key, object default=*)
    cpdef object items(self)
    cpdef list keys(self)
    cpdef void safe_del(self, str key)
    cpdef void validate_keys(self, list valid_keys) except *
    cpdef object values(self)

    # Private Methods used in BuildStream
    cpdef void _composite(self, MappingNode target) except *
    cpdef void _composite_under(self, MappingNode target) except *
    cpdef list _find(self, Node target)

    # Protected Methods
    cdef void _compose_on_composite_dict(self, MappingNode target)
    cdef void _compose_on_list(self, SequenceNode target)

    # Private Methods
    cdef void __composite(self, MappingNode target, list path) except *
    cdef Node _get(self, str key, default, default_constructor)


cdef class ScalarNode(Node):
    cdef str value

    # Public Methods
    cpdef bint as_bool(self) except *
    cpdef object as_enum(self, object constraint)
    cpdef int as_int(self) except *
    cpdef str as_str(self)
    cpdef bint is_none(self)


cdef class SequenceNode(Node):
    cdef list value

    # Public Methods
    cpdef void append(self, object value)
    cpdef list as_str_list(self)
    cpdef MappingNode mapping_at(self, int index)
    cpdef Node node_at(self, int index, list allowed_types=*)
    cpdef ScalarNode scalar_at(self, int index)
    cpdef SequenceNode sequence_at(self, int index)


cdef class ProvenanceInformation:

    cdef readonly Node _node
    cdef readonly Node _toplevel
    cdef readonly _project
    cdef readonly bint _is_synthetic
    cdef readonly str _filename
    cdef readonly str _displayname
    cdef readonly str _shortname
    cdef readonly int _col
    cdef readonly int _line


cdef int _SYNTHETIC_FILE_INDEX
cdef Py_ssize_t _create_new_file(str filename, str shortname, str displayname, object project)
cdef void _set_root_node_for_file(Py_ssize_t file_index, MappingNode contents) except *
