# ##############################################################################
# cmake/nuttx_parse_function_args.cmake
#
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements.  See the NOTICE file distributed with this work for
# additional information regarding copyright ownership.  The ASF licenses this
# file to you 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
#
# http://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.
#
# ##############################################################################

# =============================================================================
#
# Defined functions in this file
#
# utility functions
#
# * nuttx_parse_function_args
#

include(CMakeParseArguments)

# ~~~
# nuttx_parse_function_args
#
# This function simplifies usage of the cmake_parse_arguments module. It is
# intended to be called by other functions.
#
# Usage:
#   nuttx_parse_function_args( FUNC <name> [ OPTIONS <list> ]
#    [ ONE_VALUE <list> ] [ MULTI_VALUE <list> ] REQUIRED <list> ARGN <ARGN>)
#
# Input:
#   FUNC        : the name of the calling function
#   OPTIONS     : boolean flags
#   ONE_VALUE   : single value variables
#   MULTI_VALUE : multi value variables
#   REQUIRED    : required arguments
#   ARGN        : the function input arguments, typically ${ARGN}
#
# Output:
#   The function arguments corresponding to the following are set:
#     ${OPTIONS}, ${ONE_VALUE}, ${MULTI_VALUE}
#
# Example:
#  function test()
#    nuttx_parse_function_args(FUNC TEST ONE_VALUE NAME MULTI_VALUE
#                              LIST REQUIRED NAME LIST ARGN ${ARGN})
#    message(STATUS "name: ${NAME}")
#    message(STATUS "list: ${LIST}")
#  endfunction()
#
# test(NAME "hello" LIST a b c)
#
# OUTPUT: name: hello list: a b c
# ~~~
function(nuttx_parse_function_args)

  cmake_parse_arguments(IN "" "FUNC"
                        "OPTIONS;ONE_VALUE;MULTI_VALUE;REQUIRED;ARGN" "${ARGN}")
  cmake_parse_arguments(OUT "${IN_OPTIONS}" "${IN_ONE_VALUE}"
                        "${IN_MULTI_VALUE}" "${IN_ARGN}")

  if(OUT_UNPARSED_ARGUMENTS)
    message(FATAL_ERROR "${IN_NAME}: unparsed ${OUT_UNPARSED_ARGUMENTS}")
  endif()

  foreach(arg ${IN_REQUIRED})
    if(NOT OUT_${arg})
      if(NOT "${OUT_${arg}}" STREQUAL "0")
        message(
          FATAL_ERROR "${IN_NAME} requires argument ${arg}\nARGN: ${IN_ARGN}")
      endif()
    endif()
  endforeach()

  foreach(arg ${IN_OPTIONS} ${IN_ONE_VALUE} ${IN_MULTI_VALUE})
    set(${arg}
        ${OUT_${arg}}
        PARENT_SCOPE)
  endforeach()

endfunction()