#![allow(non_snake_case)] use std::collections::BTreeMap; use std::fmt::{self, Display}; use std::path::PathBuf; /// Constants for a pure type system /// /// The only axiom is: /// /// ```c /// ⊦ Type : Kind /// ``` /// /// ... and the valid rule pairs are: /// /// ```c /// ⊦ Type ↝ Type : Type -- Functions from terms to terms (ordinary functions) /// ⊦ Kind ↝ Type : Type -- Functions from types to terms (polymorphic functions) /// ⊦ Kind ↝ Kind : Kind -- Functions from types to types (type constructors) /// ``` /// /// These are the same rule pairs as System Fω /// /// Note that Dhall does not support functions from terms to types and therefore /// Dhall is not a dependently typed language /// #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum Const { Type, Kind, } /// The beginning of a file path which anchors subsequent path components #[derive(Debug, Clone, PartialEq, Eq)] pub enum FilePrefix { /// Absolute path Absolute, /// Path relative to . Here, /// Path relative to .. Parent, /// Path relative to ~ Home, } /// The location of import (i.e. local vs. remote vs. environment) #[derive(Debug, Clone, PartialEq, Eq)] pub enum ImportLocation { Local(FilePrefix, PathBuf), // TODO: other import types } /// How to interpret the import's contents (i.e. as Dhall code or raw text) #[derive(Debug, Clone, PartialEq, Eq)] pub enum ImportMode { Code, // TODO // RawText, } /// Reference to an external resource #[derive(Debug, Clone, PartialEq, Eq)] pub struct Import { pub mode: ImportMode, pub location: ImportLocation, // TODO pub hash: Option<()>, } // The type for labels throughout the AST // It owns the data because otherwise lifetimes would make recursive imports impossible #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct Label(String); impl From for Label { fn from(s: String) -> Self { Label(s) } } impl From<&'static str> for Label { fn from(s: &'static str) -> Self { Label(s.to_owned()) } } impl From