pub enum AlpacaError {
Http(String),
Json(String),
Api {
status: u16,
message: String,
error_code: Option<ApiErrorCode>,
request_id: Option<String>,
},
Auth(String),
Config(String),
WebSocket(String),
RateLimit {
retry_after_secs: u64,
info: RateLimitInfo,
},
Network(String),
Timeout(String),
InvalidData(String),
Validation(String),
ValidationErrors(Vec<ValidationError>),
}Expand description
Error types for the Alpaca API client.
Variants§
Http(String)
HTTP request errors.
Json(String)
JSON parsing errors.
Api
API errors returned by Alpaca with full details.
Fields
error_code: Option<ApiErrorCode>Alpaca-specific error code.
Auth(String)
Authentication errors.
Config(String)
Invalid configuration.
WebSocket(String)
WebSocket errors.
RateLimit
Rate limiting errors with retry information.
Fields
info: RateLimitInfoFull rate limit information.
Network(String)
Network connectivity errors.
Timeout(String)
Timeout errors.
InvalidData(String)
Invalid data format.
Validation(String)
Validation errors with field-level details.
ValidationErrors(Vec<ValidationError>)
Multiple validation errors.
Implementations§
Source§impl AlpacaError
impl AlpacaError
Sourcepub fn api(status: u16, message: impl Into<String>) -> Self
pub fn api(status: u16, message: impl Into<String>) -> Self
Creates an API error from HTTP status and message.
Examples found in repository?
69fn demonstrate_retryable_errors() {
70 let errors = [
71 ("Rate Limit", AlpacaError::rate_limit(60)),
72 (
73 "Network",
74 AlpacaError::Network("connection reset".to_string()),
75 ),
76 (
77 "Timeout",
78 AlpacaError::Timeout("request timed out".to_string()),
79 ),
80 ("Auth", AlpacaError::Auth("invalid key".to_string())),
81 ("Not Found", AlpacaError::api(404, "order not found")),
82 ("Server Error", AlpacaError::api(500, "internal error")),
83 ];
84
85 for (name, error) in errors {
86 let retry_info = if let Some(secs) = error.retry_after() {
87 format!(", retry after {} secs", secs)
88 } else {
89 String::new()
90 };
91 println!(
92 " {}: retryable={}{}",
93 name,
94 error.is_retryable(),
95 retry_info
96 );
97 }
98}Sourcepub fn api_with_details(
status: u16,
message: impl Into<String>,
error_code: ApiErrorCode,
request_id: Option<String>,
) -> Self
pub fn api_with_details( status: u16, message: impl Into<String>, error_code: ApiErrorCode, request_id: Option<String>, ) -> Self
Creates an API error with full details.
Examples found in repository?
134fn demonstrate_error_matching() {
135 let error = AlpacaError::api_with_details(
136 404,
137 "order not found",
138 ApiErrorCode::NotFound,
139 Some("req-12345".to_string()),
140 );
141
142 // Pattern match on error type
143 match &error {
144 AlpacaError::Api {
145 status,
146 message,
147 error_code,
148 request_id,
149 } => {
150 println!(" API Error detected:");
151 println!(" - Status: {}", status);
152 println!(" - Message: {}", message);
153 println!(" - Error code: {:?}", error_code);
154 println!(" - Request ID: {:?}", request_id);
155 }
156 AlpacaError::RateLimit {
157 retry_after_secs, ..
158 } => {
159 println!(" Rate limited, retry after {} seconds", retry_after_secs);
160 }
161 _ => {
162 println!(" Other error: {}", error);
163 }
164 }
165
166 // Use helper methods
167 println!("\n Helper methods:");
168 println!(" - status_code(): {:?}", error.status_code());
169 println!(" - request_id(): {:?}", error.request_id());
170 println!(" - is_retryable(): {}", error.is_retryable());
171
172 // API error response parsing
173 let response =
174 ApiErrorResponse::new(40410000, "resource not found").with_request_id("req-67890");
175 println!("\n Parsed API response:");
176 println!(" - Code: {}", response.code);
177 println!(" - Message: {}", response.message);
178 println!(" - Typed code: {:?}", response.error_code());
179}Sourcepub fn rate_limit(retry_after_secs: u64) -> Self
pub fn rate_limit(retry_after_secs: u64) -> Self
Creates a rate limit error.
Examples found in repository?
69fn demonstrate_retryable_errors() {
70 let errors = [
71 ("Rate Limit", AlpacaError::rate_limit(60)),
72 (
73 "Network",
74 AlpacaError::Network("connection reset".to_string()),
75 ),
76 (
77 "Timeout",
78 AlpacaError::Timeout("request timed out".to_string()),
79 ),
80 ("Auth", AlpacaError::Auth("invalid key".to_string())),
81 ("Not Found", AlpacaError::api(404, "order not found")),
82 ("Server Error", AlpacaError::api(500, "internal error")),
83 ];
84
85 for (name, error) in errors {
86 let retry_info = if let Some(secs) = error.retry_after() {
87 format!(", retry after {} secs", secs)
88 } else {
89 String::new()
90 };
91 println!(
92 " {}: retryable={}{}",
93 name,
94 error.is_retryable(),
95 retry_info
96 );
97 }
98}Sourcepub fn rate_limit_with_info(info: RateLimitInfo) -> Self
pub fn rate_limit_with_info(info: RateLimitInfo) -> Self
Creates a rate limit error with full info.
Examples found in repository?
100fn demonstrate_rate_limiting() {
101 // Create rate limit info from API response headers
102 let info = RateLimitInfo::new()
103 .with_remaining(0)
104 .with_limit(200)
105 .with_retry_after(60);
106
107 println!(" Rate limit status:");
108 println!(" - Remaining: {:?}", info.remaining);
109 println!(" - Limit: {:?}", info.limit);
110 println!(" - Retry after: {:?} seconds", info.retry_after);
111 println!(" - Is limited: {}", info.is_limited());
112
113 // Create error with full rate limit info
114 let error = AlpacaError::rate_limit_with_info(info);
115 println!(" Error: {}", error);
116}Sourcepub fn is_retryable(&self) -> bool
pub fn is_retryable(&self) -> bool
Returns true if this error is retryable.
Examples found in repository?
69fn demonstrate_retryable_errors() {
70 let errors = [
71 ("Rate Limit", AlpacaError::rate_limit(60)),
72 (
73 "Network",
74 AlpacaError::Network("connection reset".to_string()),
75 ),
76 (
77 "Timeout",
78 AlpacaError::Timeout("request timed out".to_string()),
79 ),
80 ("Auth", AlpacaError::Auth("invalid key".to_string())),
81 ("Not Found", AlpacaError::api(404, "order not found")),
82 ("Server Error", AlpacaError::api(500, "internal error")),
83 ];
84
85 for (name, error) in errors {
86 let retry_info = if let Some(secs) = error.retry_after() {
87 format!(", retry after {} secs", secs)
88 } else {
89 String::new()
90 };
91 println!(
92 " {}: retryable={}{}",
93 name,
94 error.is_retryable(),
95 retry_info
96 );
97 }
98}
99
100fn demonstrate_rate_limiting() {
101 // Create rate limit info from API response headers
102 let info = RateLimitInfo::new()
103 .with_remaining(0)
104 .with_limit(200)
105 .with_retry_after(60);
106
107 println!(" Rate limit status:");
108 println!(" - Remaining: {:?}", info.remaining);
109 println!(" - Limit: {:?}", info.limit);
110 println!(" - Retry after: {:?} seconds", info.retry_after);
111 println!(" - Is limited: {}", info.is_limited());
112
113 // Create error with full rate limit info
114 let error = AlpacaError::rate_limit_with_info(info);
115 println!(" Error: {}", error);
116}
117
118fn demonstrate_validation_errors() {
119 // Single validation error
120 let single_error = ValidationError::new("quantity", "must be greater than 0");
121 println!(" Single error: {}", single_error);
122
123 // Multiple validation errors
124 let errors = vec![
125 ValidationError::new("symbol", "is required"),
126 ValidationError::new("qty", "must be positive"),
127 ValidationError::new("side", "must be 'buy' or 'sell'"),
128 ];
129
130 let multi_error = AlpacaError::ValidationErrors(errors);
131 println!(" Multiple errors: {}", multi_error);
132}
133
134fn demonstrate_error_matching() {
135 let error = AlpacaError::api_with_details(
136 404,
137 "order not found",
138 ApiErrorCode::NotFound,
139 Some("req-12345".to_string()),
140 );
141
142 // Pattern match on error type
143 match &error {
144 AlpacaError::Api {
145 status,
146 message,
147 error_code,
148 request_id,
149 } => {
150 println!(" API Error detected:");
151 println!(" - Status: {}", status);
152 println!(" - Message: {}", message);
153 println!(" - Error code: {:?}", error_code);
154 println!(" - Request ID: {:?}", request_id);
155 }
156 AlpacaError::RateLimit {
157 retry_after_secs, ..
158 } => {
159 println!(" Rate limited, retry after {} seconds", retry_after_secs);
160 }
161 _ => {
162 println!(" Other error: {}", error);
163 }
164 }
165
166 // Use helper methods
167 println!("\n Helper methods:");
168 println!(" - status_code(): {:?}", error.status_code());
169 println!(" - request_id(): {:?}", error.request_id());
170 println!(" - is_retryable(): {}", error.is_retryable());
171
172 // API error response parsing
173 let response =
174 ApiErrorResponse::new(40410000, "resource not found").with_request_id("req-67890");
175 println!("\n Parsed API response:");
176 println!(" - Code: {}", response.code);
177 println!(" - Message: {}", response.message);
178 println!(" - Typed code: {:?}", response.error_code());
179}Sourcepub fn retry_after(&self) -> Option<u64>
pub fn retry_after(&self) -> Option<u64>
Returns the retry-after duration in seconds, if applicable.
Examples found in repository?
69fn demonstrate_retryable_errors() {
70 let errors = [
71 ("Rate Limit", AlpacaError::rate_limit(60)),
72 (
73 "Network",
74 AlpacaError::Network("connection reset".to_string()),
75 ),
76 (
77 "Timeout",
78 AlpacaError::Timeout("request timed out".to_string()),
79 ),
80 ("Auth", AlpacaError::Auth("invalid key".to_string())),
81 ("Not Found", AlpacaError::api(404, "order not found")),
82 ("Server Error", AlpacaError::api(500, "internal error")),
83 ];
84
85 for (name, error) in errors {
86 let retry_info = if let Some(secs) = error.retry_after() {
87 format!(", retry after {} secs", secs)
88 } else {
89 String::new()
90 };
91 println!(
92 " {}: retryable={}{}",
93 name,
94 error.is_retryable(),
95 retry_info
96 );
97 }
98}Sourcepub fn request_id(&self) -> Option<&str>
pub fn request_id(&self) -> Option<&str>
Returns the request ID if available.
Examples found in repository?
134fn demonstrate_error_matching() {
135 let error = AlpacaError::api_with_details(
136 404,
137 "order not found",
138 ApiErrorCode::NotFound,
139 Some("req-12345".to_string()),
140 );
141
142 // Pattern match on error type
143 match &error {
144 AlpacaError::Api {
145 status,
146 message,
147 error_code,
148 request_id,
149 } => {
150 println!(" API Error detected:");
151 println!(" - Status: {}", status);
152 println!(" - Message: {}", message);
153 println!(" - Error code: {:?}", error_code);
154 println!(" - Request ID: {:?}", request_id);
155 }
156 AlpacaError::RateLimit {
157 retry_after_secs, ..
158 } => {
159 println!(" Rate limited, retry after {} seconds", retry_after_secs);
160 }
161 _ => {
162 println!(" Other error: {}", error);
163 }
164 }
165
166 // Use helper methods
167 println!("\n Helper methods:");
168 println!(" - status_code(): {:?}", error.status_code());
169 println!(" - request_id(): {:?}", error.request_id());
170 println!(" - is_retryable(): {}", error.is_retryable());
171
172 // API error response parsing
173 let response =
174 ApiErrorResponse::new(40410000, "resource not found").with_request_id("req-67890");
175 println!("\n Parsed API response:");
176 println!(" - Code: {}", response.code);
177 println!(" - Message: {}", response.message);
178 println!(" - Typed code: {:?}", response.error_code());
179}Sourcepub fn status_code(&self) -> Option<u16>
pub fn status_code(&self) -> Option<u16>
Returns the HTTP status code if this is an API error.
Examples found in repository?
134fn demonstrate_error_matching() {
135 let error = AlpacaError::api_with_details(
136 404,
137 "order not found",
138 ApiErrorCode::NotFound,
139 Some("req-12345".to_string()),
140 );
141
142 // Pattern match on error type
143 match &error {
144 AlpacaError::Api {
145 status,
146 message,
147 error_code,
148 request_id,
149 } => {
150 println!(" API Error detected:");
151 println!(" - Status: {}", status);
152 println!(" - Message: {}", message);
153 println!(" - Error code: {:?}", error_code);
154 println!(" - Request ID: {:?}", request_id);
155 }
156 AlpacaError::RateLimit {
157 retry_after_secs, ..
158 } => {
159 println!(" Rate limited, retry after {} seconds", retry_after_secs);
160 }
161 _ => {
162 println!(" Other error: {}", error);
163 }
164 }
165
166 // Use helper methods
167 println!("\n Helper methods:");
168 println!(" - status_code(): {:?}", error.status_code());
169 println!(" - request_id(): {:?}", error.request_id());
170 println!(" - is_retryable(): {}", error.is_retryable());
171
172 // API error response parsing
173 let response =
174 ApiErrorResponse::new(40410000, "resource not found").with_request_id("req-67890");
175 println!("\n Parsed API response:");
176 println!(" - Code: {}", response.code);
177 println!(" - Message: {}", response.message);
178 println!(" - Typed code: {:?}", response.error_code());
179}