1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci
16fb299fa2Sopenharmony_ci/// macro wrapper for Updater::UpdaterLogger in updater
17fb299fa2Sopenharmony_ci///
18fb299fa2Sopenharmony_ci/// # intro
19fb299fa2Sopenharmony_ci/// support 5 level DEBUG, INFO, WARNING, ERROR, FATAL
20fb299fa2Sopenharmony_ci///
21fb299fa2Sopenharmony_ci/// # usage:
22fb299fa2Sopenharmony_ci/// ```
23fb299fa2Sopenharmony_ci/// let hello = "hello".to_string();
24fb299fa2Sopenharmony_ci/// updaterlog!(INFO, "this is a info log, {:?}", hello);
25fb299fa2Sopenharmony_ci/// ```
26fb299fa2Sopenharmony_ci///
27fb299fa2Sopenharmony_ci/// # note:
28fb299fa2Sopenharmony_ci/// InitLogger / SetLevel is done in C++ code. if you need to
29fb299fa2Sopenharmony_ci/// change log threshold, please add ffi interface in ffi.rs.
30fb299fa2Sopenharmony_ci///
31fb299fa2Sopenharmony_ci#[macro_export]
32fb299fa2Sopenharmony_cimacro_rules! updaterlog {
33fb299fa2Sopenharmony_ci    ($level:tt, $($arg:tt)* ) => (
34fb299fa2Sopenharmony_ci        let log_str = format!($($arg)*);
35fb299fa2Sopenharmony_ci        let file_name_str = match std::path::Path::new(file!()).file_name() {
36fb299fa2Sopenharmony_ci            Some(name_os_str) => { name_os_str.to_str() },
37fb299fa2Sopenharmony_ci            None => { None }
38fb299fa2Sopenharmony_ci        };
39fb299fa2Sopenharmony_ci        let file_name = file_name_str.unwrap_or("unknown");
40fb299fa2Sopenharmony_ci        let c_file_name = std::ffi::CString::new(file_name).expect("unknown");
41fb299fa2Sopenharmony_ci        let c_log_str = std::ffi::CString::new(log_str).expect("default log");
42fb299fa2Sopenharmony_ci        // can use CString::new(...).expect(...) because file_name and log_str can't have internal 0 byte
43fb299fa2Sopenharmony_ci        unsafe {
44fb299fa2Sopenharmony_ci            $crate::ffi::Logger(
45fb299fa2Sopenharmony_ci                $crate::ffi::LogLevel::$level as i32,
46fb299fa2Sopenharmony_ci                c_file_name.as_ptr() as *const std::ffi::c_char,
47fb299fa2Sopenharmony_ci                line!() as i32,
48fb299fa2Sopenharmony_ci                c_log_str.as_ptr() as *const std::ffi::c_char
49fb299fa2Sopenharmony_ci            )
50fb299fa2Sopenharmony_ci        };
51fb299fa2Sopenharmony_ci    )
52fb299fa2Sopenharmony_ci}