tradingview-rs 0.2.0

Tradingview datafeed api `tradingview-rs` project.
Documentation
// #[cfg(test)]
// mod tests {
//     use dotenv::dotenv;
//     use std::env;
//     use tradingview::error::*;

//     #[tokio::test]
//     #[ignore]
//     async fn test_login_empty_credentials() {
//         let mut empty_user = tradingview::models::UserCookies::default();
//         // empty_user.auth_token = "unauthorized_user_token".to_string();

//         // let result = User::build().credentials("", "").get().await;
//         // assert!(result.is_ok());
//         // assert_eq!(result.unwrap(), empty_user);
//     }

//     #[tokio::test]
//     #[ignore]
//     async fn test_login_with_credentials() {
//         dotenv().ok();
//         let mut empty_user = User::default();
//         empty_user.auth_token = "unauthorized_user_token".to_string();

//         let username = env::var("TV_USERNAME").unwrap();
//         let password = env::var("TV_PASSWORD").unwrap();

//         let result = User::build().credentials(&username, &password).get().await;

//         assert!(result.is_ok());
//         let user = result.unwrap();
//         assert_ne!(user, empty_user);
//         assert!(!user.auth_token.is_empty());
//         assert!(!user.session.is_empty());
//         assert!(!user.signature.is_empty());
//         assert!(!user.session_hash.is_empty());
//         assert!(!user.private_channel.is_empty());
//         assert!(!user.auth_token.is_empty());
//     }

//     #[tokio::test]
//     #[ignore]
//     async fn test_login_with_invalid_credentials() {
//         let mut empty_user = User::default();
//         empty_user.auth_token = "unauthorized_user_token".to_string();

//         let result = User::build().credentials("invalid", "invalid").get().await;

//         assert!(result.is_err());
//         let error = result.unwrap_err();
//         assert!(matches!(
//             error,
//             tradingview::error::Error::LoginError(LoginError::InvalidCredentials)
//         ));
//     }

//     #[tokio::test]
//     #[ignore]
//     async fn test_login_with_credentials_and_mfa() {
//         dotenv().ok();
//         let mut empty_user = User::default();
//         empty_user.auth_token = "unauthorized_user_token".to_string();

//         let username = env::var("TV_TOTP_USERNAME").unwrap();
//         let password = env::var("TV_TOTP_PASSWORD").unwrap();
//         let totp = env::var("TV_TOTP_SECRET").unwrap();

//         let result = User::build()
//             .credentials(&username, &password)
//             .totp_secret(&totp)
//             .get()
//             .await;

//         assert!(result.is_ok());
//         let user = result.unwrap();
//         assert_ne!(user, empty_user);
//         assert!(!user.auth_token.is_empty());
//         assert!(!user.session.is_empty());
//         assert!(!user.signature.is_empty());
//         assert!(!user.session_hash.is_empty());
//         assert!(!user.private_channel.is_empty());
//         assert!(!user.auth_token.is_empty());
//     }

//     #[tokio::test]
//     #[ignore]
//     async fn test_user_with_valid_session() {
//         dotenv().ok();
//         let mut empty_user = User::default();
//         empty_user.auth_token = "unauthorized_user_token".to_string();

//         let session = env::var("TV_SESSION").unwrap();
//         let signature = env::var("TV_SIGNATURE").unwrap();

//         let result = User::build().session(&session, &signature).get().await;

//         assert!(result.is_ok());
//         let user = result.unwrap();
//         assert_ne!(user, empty_user);
//         assert!(!user.auth_token.is_empty());
//         assert!(!user.session.is_empty());
//         assert!(!user.signature.is_empty());
//         assert!(!user.session_hash.is_empty());
//         assert!(!user.private_channel.is_empty());
//         assert!(!user.auth_token.is_empty());
//     }

//     #[tokio::test]
//     #[ignore]
//     async fn test_user_with_invalid_session() {
//         let mut empty_user = User::default();
//         empty_user.auth_token = "unauthorized_user_token".to_string();

//         let result = User::build()
//             .session("invalid_session", "invalid_session_signature")
//             .get()
//             .await;

//         assert!(result.is_err());
//         let error = result.unwrap_err();

//         assert!(matches!(
//             error,
//             tradingview::error::Error::LoginError(LoginError::InvalidSession)
//         ));
//     }

//     #[tokio::test]
//     #[ignore]
//     async fn test_user_with_credentials_and_invalid_mfa() {
//         dotenv().ok();
//         let mut empty_user = User::default();
//         empty_user.auth_token = "unauthorized_user_token".to_string();

//         let username = env::var("TV_TOTP_USERNAME").unwrap();
//         let password = env::var("TV_TOTP_PASSWORD").unwrap();

//         let result = User::build()
//             .credentials(&username, &password)
//             .totp_secret("ZTIXV4KTRISK4KK7")
//             .get()
//             .await;

//         assert!(result.is_err());
//         let error = result.unwrap_err();
//         assert!(matches!(
//             error,
//             tradingview::error::Error::LoginError(LoginError::InvalidOTPSecret)
//         ));
//     }
// }