Check if table contains only keys that are part of the list. If a key is found that is not part of the list, an error is allocated.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(toml_table), | intent(inout) | :: | table |
Instance of the TOML data structure |
||
character(len=*), | intent(in) | :: | valid_keys(:) |
List of keys to check. |
||
type(error_t), | intent(out), | allocatable | :: | error |
Error handling |
subroutine check_keys(table, valid_keys, error)
!> Instance of the TOML data structure
type(toml_table), intent(inout) :: table
!> List of keys to check.
character(len=*), intent(in) :: valid_keys(:)
!> Error handling
type(error_t), allocatable, intent(out) :: error
type(toml_key), allocatable :: keys(:)
type(toml_table), pointer :: child
character(:), allocatable :: name, value, valid_keys_string
integer :: ikey, ivalid
call table%get_key(name)
call table%get_keys(keys)
do ikey = 1, size(keys)
if (.not. any(keys(ikey)%key == valid_keys)) then
! Generate error message
valid_keys_string = new_line('a')//new_line('a')
do ivalid = 1, size(valid_keys)
valid_keys_string = valid_keys_string//trim(valid_keys(ivalid))//new_line('a')
end do
allocate (error)
error%message = "Key '"//keys(ikey)%key//"' not allowed in the '"// &
& name//"' table."//new_line('a')//new_line('a')//'Valid keys: '//valid_keys_string
return
end if
! Check if value can be mapped or else (wrong type) show error message with the error location.
! Right now, it can only be mapped to a string or to a child node, but this can be extended in the future.
call get_value(table, keys(ikey)%key, value)
if (.not. allocated(value)) then
! If value is not a string, check if it is a child node
call get_value(table, keys(ikey)%key, child)
if (.not.associated(child)) then
allocate (error)
error%message = "'"//name//"' has an invalid '"//keys(ikey)%key//"' entry."
return
endif
end if
end do
end subroutine check_keys