rivetkit_core/actor/
action.rs1use rivet_error::{ActorSpecifier, RivetError, RivetErrorKind};
2use serde::{Deserialize, Serialize};
3use serde_json::Value as JsonValue;
4
5use crate::error::{client_error_message, client_error_metadata, is_internal_error};
6
7#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
8pub struct ActionDispatchError {
9 pub group: String,
10 pub code: String,
11 pub message: String,
12 pub metadata: Option<JsonValue>,
13 pub actor: Option<ActorSpecifier>,
14}
15
16impl ActionDispatchError {
17 pub(crate) fn from_anyhow(error: anyhow::Error) -> Self {
18 let original_message = error.to_string();
19 let error = RivetError::extract(&error);
20 let message = if is_internal_error(error.group(), error.code()) {
21 original_message
22 } else {
23 error.message().to_owned()
24 };
25 Self {
26 group: error.group().to_owned(),
27 code: error.code().to_owned(),
28 message,
29 metadata: error.metadata(),
30 actor: error.actor().cloned(),
31 }
32 }
33
34 pub(crate) fn client_message(&self) -> &str {
35 client_error_message(&self.group, &self.code, &self.message)
36 }
37
38 pub(crate) fn client_metadata(&self) -> Option<&JsonValue> {
39 client_error_metadata(&self.group, &self.code, self.metadata.as_ref())
40 }
41
42 pub(crate) fn into_anyhow(self) -> anyhow::Error {
43 let ActionDispatchError {
44 group,
45 code,
46 message,
47 metadata,
48 actor,
49 } = self;
50 let message = client_error_message(&group, &code, &message).to_owned();
51 let meta = client_error_metadata(&group, &code, metadata.as_ref())
52 .and_then(|value| serde_json::value::to_raw_value(value).ok());
53 anyhow::Error::new(RivetError {
54 kind: RivetErrorKind::Dynamic {
55 group,
56 code,
57 default_message: message.clone(),
58 },
59 meta,
60 message: Some(message),
61 actor,
62 })
63 }
64}
65
66#[cfg(test)]
68#[path = "../../tests/modules/action_dispatch_error.rs"]
69mod tests;