
/*
 *
 *    Copyright (c) 2021 Project CHIP Authors
 *    All rights reserved.
 *
 *    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
 *
 *        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.
 */

#pragma once

#include "app/util/attribute-storage.h"
#include "pw_status/status.h"

#define RETURN_STATUS_IF_NOT_OK(expr)                                                                                              \
    do                                                                                                                             \
    {                                                                                                                              \
        pw::Status __status = chip::rpc::EmberStatusToPwStatus(expr);                                                              \
        if (!__status.ok())                                                                                                        \
        {                                                                                                                          \
            return __status;                                                                                                       \
        }                                                                                                                          \
    } while (false)

namespace chip {
namespace rpc {

constexpr pw::Status EmberStatusToPwStatus(EmberAfStatus ember_status)
{
    switch (ember_status)
    {
    case EMBER_ZCL_STATUS_SUCCESS:
        return pw::OkStatus();
    case EMBER_ZCL_STATUS_NOT_FOUND:
        return pw::Status::NotFound();
    case EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS:
        return pw::Status::PermissionDenied();
    default:
        return pw::Status::Unknown();
    }
}

} // namespace rpc
} // namespace chip
