with Ada.Directories; with Ada.Text_IO; with Ada.Strings.Unbounded; with TOML.File_IO; package body Alire_TOML is use TOML; Filename : constant String := "alire.toml"; Config : TOML_Value; function Read_Field (Key : String; Default : String := "") return String is begin if Config /= No_TOML_Value and then Config.Has (Key => Key) then return Config.Get (Key).As_String; else return Default; end if; exception when others => Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, "Error: invalid format for " & Key & " in " & Filename); return Default; end Read_Field; function Read_String_List (Key : String) return String_Vectors.Vector is Default : String_Vectors.Vector renames String_Vectors.Empty_Vector; Value : String_Vectors.Vector := Default; begin if Config /= No_TOML_Value and then Config.Has (Key => Key) then declare TOML_Tags : TOML.TOML_Value renames Config.Get (Key); begin for Index in 1 .. TOML_Tags.Length loop String_Vectors.Container.Append (Value, TOML_Tags.Item (Index).As_String); end loop; end; end if; return Value; exception when others => Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, "Error: invalid format for " & Key & " in " & Filename); return Default; end Read_String_List; procedure Load_Alire is begin if not Ada.Directories.Exists (Filename) then Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, "Error: not inside an Alire workspace (alire.toml not found)"); raise Load_Error; end if; declare Result : constant TOML.Read_Result := TOML.File_IO.Load_File (Filename); begin if Result.Success then Config := Result.Value; else Ada.Text_IO.Put (Ada.Text_IO.Standard_Error, "Error: while loading " & Filename & ":" & Result.Location.Line'Image & ":" & Result.Location.Column'Image & ": "); Ada.Text_IO.Put_Line (Ada.Text_IO.Standard_Error, Ada.Strings.Unbounded.To_String (Result.Message)); raise Load_Error with Ada.Strings.Unbounded.To_String (Result.Message); end if; end; end Load_Alire; end Alire_TOML;