Get valid access token, refreshing if needed
(&mut self)
| 98 | |
| 99 | /// Get valid access token, refreshing if needed |
| 100 | pub async fn get_valid_token(&mut self) -> Result<String, Box<dyn std::error::Error>> { |
| 101 | // If not expired, return current token |
| 102 | if !self.is_expired() { |
| 103 | return Ok(self.access_token.clone()); |
| 104 | } |
| 105 | |
| 106 | // Try to refresh |
| 107 | if let Some(ref refresh_token) = self.refresh_token { |
| 108 | match refresh_tokens(refresh_token).await { |
| 109 | Ok(new_tokens) => { |
| 110 | *self = new_tokens; |
| 111 | self.save()?; |
| 112 | return Ok(self.access_token.clone()); |
| 113 | } |
| 114 | Err(e) => { |
| 115 | eprintln!("Token refresh failed: {}. Please run 'observe login' again.", e); |
| 116 | } |
| 117 | } |
| 118 | } |
| 119 | |
| 120 | Err("Token expired. Please run 'observe login'.".into()) |
| 121 | } |
| 122 | } |
| 123 | |
| 124 | /// Start the device code login flow |
no test coverage detected