blob: ed36c4c3e10fb2a930d3cfe682efae48094da9a4 [file] [log] [blame]
/*
*
* Copyright (c) 2022 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 <lib/core/CHIPError.h>
// Note: We can use a constructor here to avoid "ToPyChipError", but it will result in compilers warning for incompatible with C
// linkage.
struct PyChipError
{
uint32_t mCode;
uint32_t mLine;
const char * mFile;
};
// To avoid the error message "user-defined type 'PyChipError' which is incompatible with C"
inline bool operator!(const PyChipError & aError)
{
return aError.mCode != 0;
}
inline bool operator==(const PyChipError & aError, const CHIP_ERROR & aOther)
{
return aError.mCode == aOther.AsInteger();
}
inline bool operator==(const CHIP_ERROR & aOther, const PyChipError & aError)
{
return aError.mCode == aOther.AsInteger();
}
inline bool operator!=(const PyChipError & aError, const CHIP_ERROR & aOther)
{
return !(aError.mCode == aOther.AsInteger());
}
inline bool operator!=(const CHIP_ERROR & aOther, const PyChipError & aError)
{
return !(aError.mCode == aOther.AsInteger());
}
inline PyChipError ToPyChipError(const CHIP_ERROR & aError)
{
return PyChipError
{
.mCode = aError.AsInteger(),
#if CHIP_CONFIG_ERROR_SOURCE
.mLine = aError.GetLine(), .mFile = aError.GetFile(),
#else
.mLine = 0, .mFile = nullptr,
#endif
};
}
// A version of ReturnErrorOnFailure which can use PyChipError as expr
// Note: we should consider implement operator == for CHIP_ERROR then we can overload it easily.
#define PyReturnErrorOnFailure(expr) \
do \
{ \
auto __err = (expr); \
if (__err != CHIP_NO_ERROR) \
{ \
return __err; \
} \
} while (false)
static_assert(std::is_same<decltype(PyChipError::mCode), chip::ChipError::StorageType>::value,
"python assumes CHIP_ERROR maps to c_uint32");
extern "C" {
void pychip_FormatError(PyChipError * apError, char * apBuf, uint32_t aBufSize);
}