--
--  Copyright (C) 2021, AdaCore
--
--  SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--

with Ada.Streams.Stream_IO;

with VSS.Strings.Conversions;
with VSS.Strings.Converters.Decoders;

package body VSS.Utils.File_IO is

   ----------
   -- Load --
   ----------

   function Load
     (Name : String) return VSS.Stream_Element_Vectors.Stream_Element_Vector
   is
      Buffer : Ada.Streams.Stream_Element_Array (1 .. 4_096);
      Last   : Ada.Streams.Stream_Element_Count;
      File   : Ada.Streams.Stream_IO.File_Type;

   begin
      return Result : VSS.Stream_Element_Vectors.Stream_Element_Vector do
         Ada.Streams.Stream_IO.Open
           (File, Ada.Streams.Stream_IO.In_File, Name);

         while not Ada.Streams.Stream_IO.End_Of_File (File) loop
            Ada.Streams.Stream_IO.Read (File, Buffer, Last);

            for J in Buffer'First .. Last loop
               Result.Append (Buffer (J));
            end loop;
         end loop;

         Ada.Streams.Stream_IO.Close (File);
      end return;

   exception
      when others =>
         Ada.Streams.Stream_IO.Close (File);

         raise;
   end Load;

   ----------
   -- Load --
   ----------

   function Load
     (Name     : String;
      Encoding : String) return VSS.Strings.Virtual_String
   is
      Decoder : VSS.Strings.Converters.Decoders.Virtual_String_Decoder;

   begin
      Decoder.Initialize
        (VSS.Strings.Conversions.To_Virtual_String (Encoding),
         (VSS.Strings.Converters.Stateless => True, others => False));

      if not Decoder.Is_Valid then
         --  Encoding is not supported.

         raise Constraint_Error;
      end if;

      return Result : constant VSS.Strings.Virtual_String :=
        Decoder.Decode (Load (Name))
      do
         if Decoder.Has_Error then
            --  Decoding error.

            raise Constraint_Error;
         end if;
      end return;
   end Load;

end VSS.Utils.File_IO;
