mago_analyzer/plugin/libraries/stdlib/random/
random_int.rs1use 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#[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}