Skip to main content

rivetkit_core/actor/
action.rs

1use 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// Test shim keeps moved tests under tests while retaining private module access.
67#[cfg(test)]
68#[path = "../../tests/modules/action_dispatch_error.rs"]
69mod tests;