with Ada.Strings.Unbounded; package Packrat is Parse_Error : exception; package Errors is subtype Error_Message is String with Dynamic_Predicate => Valid_Message (Error_Message); type Error_Info is record Symbol : Ada.Strings.Unbounded.Unbounded_String; Position : Natural; end record; type Error_Info_Array is array (Positive range <>) of Error_Info; -- Note: No consideration is given to ordering of Error_Info items -- encoded into an Error_Message string. -- Note: Using "&" to join two Valid Error_Messages together -- will result in an Error_Message that is also Valid, -- but for best results Join should be used instead to -- prevent duplication of Error_Info in the message. function Valid_Identifier (Check : in String) return Boolean; function Valid_Identifier (Check : in Ada.Strings.Unbounded.Unbounded_String) return Boolean; function Valid_Identifier_Array (Check : in Error_Info_Array) return Boolean; function Valid_Message (Check : in String) return Boolean; function Join (Left, Right : in Error_Message) return Error_Message; function Encode (Name : in String; Pos : in Natural) return Error_Message with Pre => Valid_Identifier (Name); function Encode (Name : in Ada.Strings.Unbounded.Unbounded_String; Pos : in Natural) return Error_Message with Pre => Valid_Identifier (Name); function Encode (Info : in Error_Info) return Error_Message with Pre => Valid_Identifier (Info.Symbol); function Encode_Array (Info : in Error_Info_Array) return Error_Message with Pre => Valid_Identifier_Array (Info); function Decode (Msg : in Error_Message) return Error_Info_Array; end Errors; private function "+" (S : in String) return Ada.Strings.Unbounded.Unbounded_String renames Ada.Strings.Unbounded.To_Unbounded_String; function "-" (US : in Ada.Strings.Unbounded.Unbounded_String) return String renames Ada.Strings.Unbounded.To_String; end Packrat;