1use std::sync::Arc;
2use mongodb::{Client, Database};
3use once_cell::sync::OnceCell;
4
5use crate::connection::{create_client, create_client_options};
6use crate::error::Error;
7
8pub type Result<T> = std::result::Result<T, Error>;
9
10pub(crate) static R_M_ORM_STATIC: OnceCell<Spark> = OnceCell::new();
11
12#[derive(Debug)]
13pub struct Spark {
14 #[allow(dead_code)]
15 client: Client,
16 db: Arc<Database>,
17}
18
19impl Spark {
20 pub async fn global_connect(
21 user_name: &str,
22 password: &str,
23 host: &str,
24 port: &str,
25 db_name: &str,
26 ) -> Arc<Database> {
27 Self::init_logger();
28 let client_options = create_client_options(user_name, password, host, port)
29 .await
30 .unwrap();
31 let client = create_client(client_options).unwrap();
32 let db = client.database(db_name);
37 let rs = Spark {
38 client,
39 db: Arc::new(db),
40 };
41 R_M_ORM_STATIC.set(rs).unwrap();
42 Self::get_db()
43 }
44
45 pub async fn connect(
46 user_name: &str,
47 password: &str,
48 host: &str,
49 port: &str,
50 db_name: &str,
51 ) -> Database {
52 Self::init_logger();
53 let client_options = create_client_options(user_name, password, host, port)
54 .await
55 .unwrap();
56 let client = create_client(client_options).unwrap();
57 client.database(db_name)
58 }
59 pub fn get_db() -> Arc<Database> {
60 let spark = R_M_ORM_STATIC.get();
61 match spark {
62 Some(rs) => rs.db.clone(),
63 None => panic!("The Data base not set !!!"),
64 }
65 }
66
67 pub fn from_mongo_result<T>(re: mongodb::error::Result<T>) -> Result<T> {
68 match re {
69 Ok(inner_re) => Ok(inner_re),
70 Err(error) => Err(Error::new(&error.to_string())),
71 }
72 }
73
74 pub fn use_db(){
75
76 }
77 fn init_logger() {
78 env_logger::init();
79 }
80}