recursive subroutine fillMembersState(self, state, root_key, keywordEnforcer, rc)
class(ESMF_InfoDescribe), intent(inout) :: self
type(ESMF_State), intent(in) :: state
character(*), intent(in) :: root_key
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
integer, intent(inout), optional :: rc
type(ESMF_Array) :: array
type(ESMF_ArrayBundle) :: arraybundle
type(ESMF_Field), target :: field
type(ESMF_FieldBundle) :: fieldbundle
type(ESMF_RouteHandle) :: rh
type(ESMF_State) :: state_nested
type(ESMF_StateItem_Flag), dimension(:), allocatable :: stateTypes
character(len=ESMF_MAXSTR), dimension(:), allocatable :: stateNames
character(len=ESMF_MAXSTR) :: name
integer :: ii, jj, itemCount, localrc
localrc = ESMF_FAILURE
if (present(rc)) rc = ESMF_RC_NOT_IMPL
call ESMF_StateGet(state, itemCount=itemCount, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
allocate(stateTypes(itemCount), stateNames(itemCount))
call ESMF_StateGet(state, itemTypeList=stateTypes, itemNameList=stateNames, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
do ii=1,itemCount
select case (stateTypes(ii)%ot)
case(ESMF_STATEITEM_ARRAY%ot)
call ESMF_StateGet(state, trim(stateNames(ii)), array, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
call self%Update(array, root_key, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
case(ESMF_STATEITEM_ARRAYBUNDLE%ot)
call ESMF_StateGet(state, trim(stateNames(ii)), arraybundle, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
call self%Update(arraybundle, root_key, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
case(ESMF_STATEITEM_STATE%ot)
call ESMF_StateGet(state, trim(stateNames(ii)), state_nested, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
call self%Update(state_nested, root_key, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
case(ESMF_STATEITEM_FIELD%ot)
call ESMF_StateGet(state, trim(stateNames(ii)), field, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
call self%Update(field, root_key, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
case(ESMF_STATEITEM_FIELDBUNDLE%ot)
call ESMF_StateGet(state, trim(stateNames(ii)), fieldbundle, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
call self%Update(fieldbundle, root_key, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
case(ESMF_STATEITEM_ROUTEHANDLE%ot)
call ESMF_StateGet(state, trim(stateNames(ii)), rh, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
call self%Update(rh, root_key, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
case default
if (ESMF_LogFoundError(ESMF_RC_OBJ_NOT_CREATED, msg="Object type not supported for Inquire", &
ESMF_CONTEXT, rcToReturn=rc)) return
end select
end do
deallocate(stateTypes, stateNames)
if (present(rc)) rc = ESMF_SUCCESS
end subroutine fillMembersState