snarkvm_synthesizer_program/import/
mod.rs

1// Copyright (c) 2019-2025 Provable Inc.
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16mod bytes;
17mod parse;
18
19use console::{
20    network::prelude::*,
21    program::{Identifier, ProgramID},
22};
23
24/// An import statement defines an imported program, and is of the form `import {name}.{network};`.
25/// If no `network`-level domain is specified, the default network is used.
26#[derive(Clone, PartialEq, Eq, Hash)]
27pub struct Import<N: Network> {
28    /// The imported program ID.
29    program_id: ProgramID<N>,
30}
31
32impl<N: Network> Import<N> {
33    /// Returns the imported program ID.
34    #[inline]
35    pub const fn program_id(&self) -> &ProgramID<N> {
36        &self.program_id
37    }
38
39    /// Returns the imported program name.
40    #[inline]
41    pub const fn name(&self) -> &Identifier<N> {
42        self.program_id.name()
43    }
44
45    /// Returns the imported network-level domain (NLD).
46    #[inline]
47    pub const fn network(&self) -> &Identifier<N> {
48        self.program_id.network()
49    }
50}
51
52impl<N: Network> TypeName for Import<N> {
53    /// Returns the type name as a string.
54    #[inline]
55    fn type_name() -> &'static str {
56        "import"
57    }
58}
59
60impl<N: Network> Ord for Import<N> {
61    /// Ordering is determined by the NLD first, then the program name second.
62    fn cmp(&self, other: &Self) -> Ordering {
63        self.program_id.cmp(&other.program_id)
64    }
65}
66
67impl<N: Network> PartialOrd for Import<N> {
68    /// Ordering is determined by the NLD first, then the program name second.
69    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
70        Some(self.cmp(other))
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use console::network::MainnetV0;
78
79    type CurrentNetwork = MainnetV0;
80
81    #[test]
82    fn test_import_type_name() -> Result<()> {
83        assert_eq!(Import::<CurrentNetwork>::type_name(), "import");
84        Ok(())
85    }
86
87    #[test]
88    fn test_import_partial_ord() -> Result<()> {
89        let import1 = Import::<CurrentNetwork>::from_str("import bar.aleo;")?;
90        let import2 = Import::<CurrentNetwork>::from_str("import foo.aleo;")?;
91
92        let import3 = Import::<CurrentNetwork>::from_str("import bar.aleo;")?;
93        let import4 = Import::<CurrentNetwork>::from_str("import foo.aleo;")?;
94
95        assert_eq!(import1.partial_cmp(&import1), Some(Ordering::Equal));
96        assert_eq!(import1.partial_cmp(&import2), Some(Ordering::Less));
97        assert_eq!(import1.partial_cmp(&import3), Some(Ordering::Equal));
98        assert_eq!(import1.partial_cmp(&import4), Some(Ordering::Less));
99
100        assert_eq!(import2.partial_cmp(&import1), Some(Ordering::Greater));
101        assert_eq!(import2.partial_cmp(&import2), Some(Ordering::Equal));
102        assert_eq!(import2.partial_cmp(&import3), Some(Ordering::Greater));
103        assert_eq!(import2.partial_cmp(&import4), Some(Ordering::Equal));
104
105        assert_eq!(import3.partial_cmp(&import1), Some(Ordering::Equal));
106        assert_eq!(import3.partial_cmp(&import2), Some(Ordering::Less));
107        assert_eq!(import3.partial_cmp(&import3), Some(Ordering::Equal));
108        assert_eq!(import3.partial_cmp(&import4), Some(Ordering::Less));
109
110        assert_eq!(import4.partial_cmp(&import1), Some(Ordering::Greater));
111        assert_eq!(import4.partial_cmp(&import2), Some(Ordering::Equal));
112        assert_eq!(import4.partial_cmp(&import3), Some(Ordering::Greater));
113        assert_eq!(import4.partial_cmp(&import4), Some(Ordering::Equal));
114
115        Ok(())
116    }
117}