Skip to main content

mago_analyzer/plugin/libraries/stdlib/random/
random_int.rs

1//! `random_int()` return type provider.
2
3use mago_codex::ttype::get_int_range;
4use mago_codex::ttype::union::TUnion;
5
6use crate::plugin::context::InvocationInfo;
7use crate::plugin::context::ProviderContext;
8use crate::plugin::provider::Provider;
9use crate::plugin::provider::ProviderMeta;
10use crate::plugin::provider::function::FunctionReturnTypeProvider;
11use crate::plugin::provider::function::FunctionTarget;
12
13static META: ProviderMeta =
14    ProviderMeta::new("php::random::random_int", "random_int", "Returns int range based on min/max arguments");
15
16/// Provider for the `random_int()` function.
17///
18/// Returns an int range based on the min/max arguments.
19#[derive(Default)]
20pub struct RandomIntProvider;
21
22impl Provider for RandomIntProvider {
23    fn meta() -> &'static ProviderMeta {
24        &META
25    }
26}
27
28impl FunctionReturnTypeProvider for RandomIntProvider {
29    fn targets() -> FunctionTarget {
30        FunctionTarget::Exact("random_int")
31    }
32
33    fn get_return_type(
34        &self,
35        context: &ProviderContext<'_, '_, '_>,
36        invocation: &InvocationInfo<'_, '_, '_>,
37    ) -> Option<TUnion> {
38        let min_argument = invocation.get_argument(0, &["min"])?;
39        let min_argument_type = context.get_expression_type(min_argument)?;
40        let min_argument_integer = min_argument_type.get_single_int()?;
41
42        let max_argument = invocation.get_argument(1, &["max"])?;
43        let max_argument_type = context.get_expression_type(max_argument)?;
44        let max_argument_integer = max_argument_type.get_single_int()?;
45
46        let minimum_value = min_argument_integer.get_minimum_value()?;
47        let maximum_value = max_argument_integer.get_maximum_value();
48
49        Some(get_int_range(Some(minimum_value), maximum_value))
50    }
51}