src/Pure/System/registry.scala
author wenzelm
Thu, 11 Jan 2024 12:37:10 +0100
changeset 79474 c39aed404ffc
parent 78965 890783dc4bc6
child 79651 155bb0ae4ae2
permissions -rw-r--r--
more uniform treatment of "hyps" within zproof;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
78939
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/registry.scala
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     3
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     4
Hierarchic system configuration in TOML notation.
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     5
*/
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     6
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     7
package isabelle
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     8
218929597048 support for global registry;
wenzelm
parents:
diff changeset
     9
218929597048 support for global registry;
wenzelm
parents:
diff changeset
    10
object Registry {
78950
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    11
  /* registry files */
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    12
78951
c8c40e11c907 clarified signature: more operations;
wenzelm
parents: 78950
diff changeset
    13
  def load(files: Iterable[Path]): Registry = new Registry(TOML.parse_files(files))
c8c40e11c907 clarified signature: more operations;
wenzelm
parents: 78950
diff changeset
    14
c8c40e11c907 clarified signature: more operations;
wenzelm
parents: 78950
diff changeset
    15
  def global_files(): List[Path] =
78939
218929597048 support for global registry;
wenzelm
parents:
diff changeset
    16
    Path.split_permissive_files(Isabelle_System.getenv("ISABELLE_REGISTRY"))
218929597048 support for global registry;
wenzelm
parents:
diff changeset
    17
78951
c8c40e11c907 clarified signature: more operations;
wenzelm
parents: 78950
diff changeset
    18
  lazy val global: Registry = load(global_files())
78942
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    19
78950
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    20
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    21
  /* interpreted entries */
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    22
78962
7a58c1199de3 tuned signature;
wenzelm
parents: 78961
diff changeset
    23
  trait Category {
7a58c1199de3 tuned signature;
wenzelm
parents: 78961
diff changeset
    24
    def prefix: String
78942
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    25
    override def toString: String = "Registry.Category(" + quote(prefix) + ")"
78961
11045cf2b5c2 tuned signature: more operations;
wenzelm
parents: 78960
diff changeset
    26
    def qualify(name: String): String = Long_Name.qualify(prefix, name)
11045cf2b5c2 tuned signature: more operations;
wenzelm
parents: 78960
diff changeset
    27
    def try_unqualify(name: String): Option[String] = Long_Name.try_unqualify(prefix, name)
11045cf2b5c2 tuned signature: more operations;
wenzelm
parents: 78960
diff changeset
    28
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    29
    type Value
78962
7a58c1199de3 tuned signature;
wenzelm
parents: 78961
diff changeset
    30
    def bad_value(name: String): Nothing = error("Bad registry entry " + quote(qualify(name)))
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    31
    def default_value(registry: Registry, name: String): Value
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    32
    def value(registry: Registry, t: TOML.T, name: String): Value
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    33
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    34
    def get(registry: Registry, name: String): Value = {
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    35
      registry.root.any.get(prefix) match {
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    36
        case None => default_value(registry, name)
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    37
        case Some(t: TOML.Table) =>
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    38
          t.any.get(name) match {
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    39
            case None => default_value(registry, name)
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    40
            case Some(u) => value(registry, u, name)
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    41
          }
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    42
        case Some(_) => bad_value(name)
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    43
      }
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    44
    }
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    45
  }
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    46
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    47
  trait Strict extends Category {
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    48
    override def default_value(registry: Registry, name: String): Value = bad_value(name)
78942
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    49
  }
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    50
78962
7a58c1199de3 tuned signature;
wenzelm
parents: 78961
diff changeset
    51
  trait Table extends Category {
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    52
    def table_value(registry: Registry, table: TOML.Table, name: String): Value
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    53
    override def default_value(registry: Registry, name: String): Value =
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    54
      table_value(registry, TOML.Table.empty, name)
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    55
    override def value(registry: Registry, t: TOML.T, name: String): Value =
78942
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    56
      t match {
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    57
        case table: TOML.Table => table_value(registry, table, name)
78960
f4e7dec70fa4 clarified signature;
wenzelm
parents: 78959
diff changeset
    58
        case _ => bad_value(name)
78942
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    59
      }
409442cb7814 support interpreted/typed entries via Registry.Category and Registry.Table;
wenzelm
parents: 78940
diff changeset
    60
  }
78945
73162a487f94 build cluster host specifications are based on registry entries (table prefix "host");
wenzelm
parents: 78942
diff changeset
    61
78950
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    62
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    63
  /* build cluster resources */
cd350dcd912a tuned comments;
wenzelm
parents: 78947
diff changeset
    64
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    65
  trait Host extends Table {
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    66
    def prefix = "host"
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    67
    type Value = List[Options.Spec]
78962
7a58c1199de3 tuned signature;
wenzelm
parents: 78961
diff changeset
    68
78945
73162a487f94 build cluster host specifications are based on registry entries (table prefix "host");
wenzelm
parents: 78942
diff changeset
    69
    def options_spec(a: TOML.Key, b: TOML.T): Option[Options.Spec] =
78947
2a27d2c8eae8 prefer strict test of system options;
wenzelm
parents: 78945
diff changeset
    70
      TOML.Scalar.unapply(b).map(Options.Spec.eq(a, _))
78945
73162a487f94 build cluster host specifications are based on registry entries (table prefix "host");
wenzelm
parents: 78942
diff changeset
    71
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    72
    override def table_value(registry: Registry, t: TOML.Table, a: String): Value =
78945
73162a487f94 build cluster host specifications are based on registry entries (table prefix "host");
wenzelm
parents: 78942
diff changeset
    73
      for ((a, b) <- t.any.values; s <- options_spec(a, b)) yield s
73162a487f94 build cluster host specifications are based on registry entries (table prefix "host");
wenzelm
parents: 78942
diff changeset
    74
  }
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    75
  object Host extends Host
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    76
  object Host_Strict extends Host with Strict
78964
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    77
  object Host_Cluster extends Host with Strict { override def prefix = Cluster.prefix }
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    78
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    79
  object Cluster extends Table with Strict {
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    80
    def prefix = "cluster"
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    81
    def prefix_hosts = "hosts"
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    82
    type Value = List[(String, List[Options.Spec])]
78964
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    83
78965
890783dc4bc6 tuned signature;
wenzelm
parents: 78964
diff changeset
    84
    override def table_value(registry: Registry, t: TOML.Table, a: String): Value = {
78964
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    85
      val hosts =
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    86
        t.array.get(prefix_hosts) match {
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    87
          case Some(arr) => arr.string.values.map(_.rep)
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    88
          case None => bad_value(Long_Name.qualify(a, prefix_hosts))
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    89
        }
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    90
      val cluster_specs = Host_Cluster.get(registry, a)
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    91
      hosts.map(h => (h, Host_Strict.get(registry, h) ::: cluster_specs))
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    92
    }
a2de1f6ff94e support for "cluster" table with "hosts" array, and params/options as for "host" table;
wenzelm
parents: 78963
diff changeset
    93
  }
78939
218929597048 support for global registry;
wenzelm
parents:
diff changeset
    94
}
218929597048 support for global registry;
wenzelm
parents:
diff changeset
    95
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    96
class Registry private(val root: TOML.Table) {
78959
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
    97
  override def toString: String =
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
    98
    (for (a <- root.domain.toList.sorted.iterator) yield {
78959
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
    99
      val size =
78963
30360ee939f4 clarified signature: more operations, allow recursive get;
wenzelm
parents: 78962
diff changeset
   100
        root.any.get(a) match {
78959
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
   101
          case Some(t: TOML.Array) => "(" + t.length + ")"
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
   102
          case Some(t: TOML.Table) => "(" + t.domain.size + ")"
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
   103
          case _ => ""
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
   104
        }
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
   105
      a + size
78698a97afb3 tuned output;
wenzelm
parents: 78951
diff changeset
   106
    }).mkString("Registry(", ", ", ")")
78940
4cb67b3895b9 clarified output;
wenzelm
parents: 78939
diff changeset
   107
}