1#![doc = include_str!("readme.md")]
2use core::range::Range;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct FSharpRoot {
12 pub items: Vec<Item>,
14}
15
16#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub enum Item {
20 Namespace(NamespaceDeclaration),
22 Module(ModuleDeclaration),
24 Open(OpenDirective),
26 Binding(Binding),
28}
29
30#[derive(Debug, Clone, PartialEq)]
32#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
33pub struct NamespaceDeclaration {
34 pub name: String,
36 pub items: Vec<Item>,
38 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
40 pub span: Range<usize>,
41}
42
43#[derive(Debug, Clone, PartialEq)]
45#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
46pub struct ModuleDeclaration {
47 pub name: String,
49 pub is_top_level: bool,
51 pub items: Vec<Item>,
53 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55 pub span: Range<usize>,
56}
57
58#[derive(Debug, Clone, PartialEq)]
60#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
61pub struct OpenDirective {
62 pub path: String,
64 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
66 pub span: Range<usize>,
67}
68
69#[derive(Debug, Clone, PartialEq)]
71#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72pub struct Binding {
73 pub name: String,
75 pub is_rec: bool,
77 pub parameters: Vec<String>,
79 pub expression: Expression,
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83 pub span: Range<usize>,
84}
85
86#[derive(Debug, Clone, PartialEq)]
88#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
89pub enum Expression {
90 Simple(String),
92 If {
94 condition: Box<Expression>,
96 then_branch: Box<Expression>,
98 else_branch: Option<Box<Expression>>,
100 },
101}