1cc290419Sopenharmony_ci/*
2cc290419Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3cc290419Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4cc290419Sopenharmony_ci * you may not use this file except in compliance with the License.
5cc290419Sopenharmony_ci * You may obtain a copy of the License at
6cc290419Sopenharmony_ci *
7cc290419Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8cc290419Sopenharmony_ci *
9cc290419Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10cc290419Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11cc290419Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cc290419Sopenharmony_ci * See the License for the specific language governing permissions and
13cc290419Sopenharmony_ci * limitations under the License.
14cc290419Sopenharmony_ci */
15cc290419Sopenharmony_ci//! utils
16cc290419Sopenharmony_ci#![allow(missing_docs)]
17cc290419Sopenharmony_ci
18cc290419Sopenharmony_ciuse crate::config::{SHELL_PROG, WIN_CMD_PROG};
19cc290419Sopenharmony_ci
20cc290419Sopenharmony_ciuse std::future::Future;
21cc290419Sopenharmony_ciuse std::io::{self, Error, ErrorKind};
22cc290419Sopenharmony_ciuse std::process::Command;
23cc290419Sopenharmony_ciuse std::time::{SystemTime, UNIX_EPOCH};
24cc290419Sopenharmony_ci
25cc290419Sopenharmony_ci#[cfg(feature = "host")]
26cc290419Sopenharmony_ciextern crate ylong_runtime_static as ylong_runtime;
27cc290419Sopenharmony_ciuse ylong_runtime::io::AsyncWriteExt;
28cc290419Sopenharmony_ci
29cc290419Sopenharmony_cipub fn get_pseudo_random_u32() -> u32 {
30cc290419Sopenharmony_ci    (SystemTime::now()
31cc290419Sopenharmony_ci        .duration_since(UNIX_EPOCH)
32cc290419Sopenharmony_ci        .unwrap()
33cc290419Sopenharmony_ci        .as_nanos()
34cc290419Sopenharmony_ci        & 0xffffffff) as u32
35cc290419Sopenharmony_ci}
36cc290419Sopenharmony_ci
37cc290419Sopenharmony_cipub fn get_current_time() -> u64 {
38cc290419Sopenharmony_ci    SystemTime::now()
39cc290419Sopenharmony_ci        .duration_since(UNIX_EPOCH)
40cc290419Sopenharmony_ci        .unwrap()
41cc290419Sopenharmony_ci        .as_millis() as u64
42cc290419Sopenharmony_ci}
43cc290419Sopenharmony_ci
44cc290419Sopenharmony_cipub async fn print_msg(buf: Vec<u8>) -> io::Result<()> {
45cc290419Sopenharmony_ci    let mut stdout = ylong_runtime::io::stdout();
46cc290419Sopenharmony_ci    let _ = stdout.write(&buf).await;
47cc290419Sopenharmony_ci    let _ = stdout.flush().await;
48cc290419Sopenharmony_ci    Ok(())
49cc290419Sopenharmony_ci}
50cc290419Sopenharmony_ci
51cc290419Sopenharmony_cipub fn execute_cmd(cmd: String) -> Result<std::process::Output, Error> {
52cc290419Sopenharmony_ci    let arg_sign = if cfg!(target_os = "windows") {
53cc290419Sopenharmony_ci        "/c"
54cc290419Sopenharmony_ci    } else {
55cc290419Sopenharmony_ci        "-c"
56cc290419Sopenharmony_ci    };
57cc290419Sopenharmony_ci
58cc290419Sopenharmony_ci    let programe = if cfg!(target_os = "windows") {
59cc290419Sopenharmony_ci        WIN_CMD_PROG
60cc290419Sopenharmony_ci    } else {
61cc290419Sopenharmony_ci        SHELL_PROG
62cc290419Sopenharmony_ci    };
63cc290419Sopenharmony_ci
64cc290419Sopenharmony_ci    Command::new(programe).args([arg_sign, &cmd]).output()
65cc290419Sopenharmony_ci}
66cc290419Sopenharmony_ci
67cc290419Sopenharmony_cipub fn error_other(msg: String) -> Error {
68cc290419Sopenharmony_ci    Error::new(ErrorKind::Other, msg)
69cc290419Sopenharmony_ci}
70cc290419Sopenharmony_ci
71cc290419Sopenharmony_cipub fn bytes_to_string(message: Vec<u8>) -> String {
72cc290419Sopenharmony_ci    let msg = String::from_utf8(message);
73cc290419Sopenharmony_ci    match msg {
74cc290419Sopenharmony_ci        Ok(str) => str,
75cc290419Sopenharmony_ci        Err(_e) => "".to_string(),
76cc290419Sopenharmony_ci    }
77cc290419Sopenharmony_ci}
78cc290419Sopenharmony_ci
79cc290419Sopenharmony_ci#[allow(missing_docs)]
80cc290419Sopenharmony_cipub fn spawn<T>(fun : T) -> ylong_runtime::task::JoinHandle<()>
81cc290419Sopenharmony_ciwhere
82cc290419Sopenharmony_ci    T : Future<Output = ()>,
83cc290419Sopenharmony_ci    T : Send + 'static,
84cc290419Sopenharmony_ci    T : Sync
85cc290419Sopenharmony_ci{
86cc290419Sopenharmony_ci    ylong_runtime::spawn(Box::into_pin(Box::new(fun) as Box<dyn Future<Output = ()> + Send + Sync>))
87cc290419Sopenharmony_ci}
88cc290419Sopenharmony_ci
89cc290419Sopenharmony_cipub mod hdc_log {
90cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
91cc290419Sopenharmony_ci    pub use hilog_rust::{hilog, HiLogLabel, LogType};
92cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
93cc290419Sopenharmony_ci    pub use std::ffi::{c_char, CString};
94cc290419Sopenharmony_ci
95cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
96cc290419Sopenharmony_ci    pub const LOG_LABEL: HiLogLabel = HiLogLabel {
97cc290419Sopenharmony_ci        log_type: LogType::LogCore,
98cc290419Sopenharmony_ci        domain: 0xD002D13,
99cc290419Sopenharmony_ci        tag: "HDC_LOG",
100cc290419Sopenharmony_ci    };
101cc290419Sopenharmony_ci
102cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
103cc290419Sopenharmony_ci    #[inline(never)]
104cc290419Sopenharmony_ci    pub fn get_file_name(path: &str) -> &str {
105cc290419Sopenharmony_ci        path.split('/').last().unwrap_or(path)
106cc290419Sopenharmony_ci    }
107cc290419Sopenharmony_ci
108cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
109cc290419Sopenharmony_ci    #[macro_export]
110cc290419Sopenharmony_ci    macro_rules! trace {
111cc290419Sopenharmony_ci        ($($arg:tt)+) => {
112cc290419Sopenharmony_ci            hilog_rust::debug!(LOG_LABEL, "{}:{} {}", @public(get_file_name(file!())), @public(line!()),  @public(format!($($arg)+)));
113cc290419Sopenharmony_ci            log::trace!($($arg)+);
114cc290419Sopenharmony_ci        };
115cc290419Sopenharmony_ci    }
116cc290419Sopenharmony_ci
117cc290419Sopenharmony_ci    #[cfg(feature = "host")]
118cc290419Sopenharmony_ci    #[macro_export]
119cc290419Sopenharmony_ci    macro_rules! trace {
120cc290419Sopenharmony_ci        ($($arg:tt)+) => {
121cc290419Sopenharmony_ci            log::trace!($($arg)+);
122cc290419Sopenharmony_ci        };
123cc290419Sopenharmony_ci    }
124cc290419Sopenharmony_ci
125cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
126cc290419Sopenharmony_ci    #[macro_export]
127cc290419Sopenharmony_ci    macro_rules! debug {
128cc290419Sopenharmony_ci        ($($arg:tt)+) => {
129cc290419Sopenharmony_ci            hilog_rust::debug!(LOG_LABEL, "{}:{} {}", @public(get_file_name(file!())), @public(line!()),  @public(format!($($arg)+)));
130cc290419Sopenharmony_ci            log::debug!($($arg)+);
131cc290419Sopenharmony_ci        };
132cc290419Sopenharmony_ci    }
133cc290419Sopenharmony_ci
134cc290419Sopenharmony_ci    #[cfg(feature = "host")]
135cc290419Sopenharmony_ci    #[macro_export]
136cc290419Sopenharmony_ci    macro_rules! debug {
137cc290419Sopenharmony_ci        ($($arg:tt)+) => {
138cc290419Sopenharmony_ci            log::debug!($($arg)+);
139cc290419Sopenharmony_ci        };
140cc290419Sopenharmony_ci    }
141cc290419Sopenharmony_ci
142cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
143cc290419Sopenharmony_ci    #[macro_export]
144cc290419Sopenharmony_ci    macro_rules! info {
145cc290419Sopenharmony_ci        ($($arg:tt)+) => {
146cc290419Sopenharmony_ci            hilog_rust::info!(LOG_LABEL, "{}:{} {}", @public(get_file_name(file!())), @public(line!()),  @public(format!($($arg)+)));
147cc290419Sopenharmony_ci            log::info!($($arg)+);
148cc290419Sopenharmony_ci        };
149cc290419Sopenharmony_ci    }
150cc290419Sopenharmony_ci
151cc290419Sopenharmony_ci    #[cfg(feature = "host")]
152cc290419Sopenharmony_ci    #[macro_export]
153cc290419Sopenharmony_ci    macro_rules! info {
154cc290419Sopenharmony_ci        ($($arg:tt)+) => {
155cc290419Sopenharmony_ci            log::info!($($arg)+);
156cc290419Sopenharmony_ci        };
157cc290419Sopenharmony_ci    }
158cc290419Sopenharmony_ci
159cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
160cc290419Sopenharmony_ci    #[macro_export]
161cc290419Sopenharmony_ci    macro_rules! warn {
162cc290419Sopenharmony_ci        ($($arg:tt)+) => {
163cc290419Sopenharmony_ci            hilog_rust::warn!(LOG_LABEL, "{}:{} {}", @public(get_file_name(file!())), @public(line!()),  @public(format!($($arg)+)));
164cc290419Sopenharmony_ci            log::warn!($($arg)+);
165cc290419Sopenharmony_ci        };
166cc290419Sopenharmony_ci    }
167cc290419Sopenharmony_ci
168cc290419Sopenharmony_ci    #[cfg(feature = "host")]
169cc290419Sopenharmony_ci    #[macro_export]
170cc290419Sopenharmony_ci    macro_rules! warn {
171cc290419Sopenharmony_ci        ($($arg:tt)+) => {
172cc290419Sopenharmony_ci            log::warn!($($arg)+);
173cc290419Sopenharmony_ci        };
174cc290419Sopenharmony_ci    }
175cc290419Sopenharmony_ci
176cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
177cc290419Sopenharmony_ci    #[macro_export]
178cc290419Sopenharmony_ci    macro_rules! error {
179cc290419Sopenharmony_ci        ($($arg:tt)+) => {
180cc290419Sopenharmony_ci            hilog_rust::error!(LOG_LABEL, "{}:{} {}", @public(get_file_name(file!())), @public(line!()),  @public(format!($($arg)+)));
181cc290419Sopenharmony_ci            log::error!($($arg)+);
182cc290419Sopenharmony_ci        };
183cc290419Sopenharmony_ci    }
184cc290419Sopenharmony_ci
185cc290419Sopenharmony_ci    #[cfg(feature = "host")]
186cc290419Sopenharmony_ci    #[macro_export]
187cc290419Sopenharmony_ci    macro_rules! error {
188cc290419Sopenharmony_ci        ($($arg:tt)+) => {
189cc290419Sopenharmony_ci            log::error!($($arg)+);
190cc290419Sopenharmony_ci        };
191cc290419Sopenharmony_ci    }
192cc290419Sopenharmony_ci
193cc290419Sopenharmony_ci    #[cfg(not(feature = "host"))]
194cc290419Sopenharmony_ci    #[macro_export]
195cc290419Sopenharmony_ci    macro_rules! fatal {
196cc290419Sopenharmony_ci        ($($arg:tt)+) => {
197cc290419Sopenharmony_ci            hilog_rust::fatal!(LOG_LABEL, "{}:{} {}", @public(get_file_name(file!())), @public(line!()),  @public(format!($($arg)+)));
198cc290419Sopenharmony_ci            log::fatal!($($arg)+);
199cc290419Sopenharmony_ci        };
200cc290419Sopenharmony_ci    }
201cc290419Sopenharmony_ci
202cc290419Sopenharmony_ci    #[cfg(feature = "host")]
203cc290419Sopenharmony_ci    #[macro_export]
204cc290419Sopenharmony_ci    macro_rules! fatal {
205cc290419Sopenharmony_ci        ($($arg:tt)+) => {
206cc290419Sopenharmony_ci            log::fatal!($($arg)+);
207cc290419Sopenharmony_ci        };
208cc290419Sopenharmony_ci    }
209cc290419Sopenharmony_ci
210cc290419Sopenharmony_ci    // pub use crate::{trace, debug, info, warn, error, fatal};
211cc290419Sopenharmony_ci}
212