--
-- Copyright (C) 2023-2024, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-Exception
--
with GPR2.Source_Reference;
with GPR2.Utils.Hash;
private with Ada.Tags;
package GPR2.Build.Artifacts is
use GPR2.Utils.Hash;
type Object is interface;
-- Artifacts are the nodes of the Tree DB graph, and represent the
-- various ingredients used during a build process: sources, object files,
-- dependency files, libraries, environment variables and so on.
--
-- Artifacts have identified classes that allow sorting the artifacts
-- by category and generate related actions to generate the next stage
-- artifacts (so for example source artifacts generate object file
-- artifacts).
function Is_Defined (Self : Object) return Boolean is abstract;
procedure Unserialize
(Uri : String;
Val : out Object) is abstract;
-- Used to deserialize an artifact. The protocol part is removed from the
-- uri before Unserialize is called.
function Image (Self : Object) return String is abstract;
-- This value is used when unserializing the artifact (see Create above).
-- It is also used to report artifact-related messages to the end user.
--
-- ??? May require two similar primitives here: one for the end user and
-- one for the serialization.
function SLOC (Self : Object) return GPR2.Source_Reference.Object'Class
is abstract;
-- A source reference object, to be used in error reporting to locate the
-- artifact.
function Checksum (Self : Object) return Hash_Digest is abstract;
-- The current checksum of the resource
function "<" (L, R : Object) return Boolean is abstract;
function Hash (Self : Object) return Ada.Containers.Hash_Type is abstract;
function Less (L, R : Object'Class) return Boolean;
-- Class wide comparison, compares object type's external tags if L and R
-- are not of the same type.
function Protocol (Self : Object) return String is abstract;
-- Must be constant for a class of artifacts. Is used to
-- serialize / unserialize artifacts.
procedure Register_Artifact_Class
(Artifact : Object'Class);
-- Used to register a new artifact class. The artifacts handled by
-- libgpr2 are all registered at elaboration time in the body of this
-- package.
subtype Uri_Type is String;
function To_Uri (Artifact : Object'Class) return Uri_Type;
function From_Uri (Uri : Uri_Type) return Object'Class;
-- Translates an Uri into object. Raises Constraint_Error if the protocol
-- was not registered before.
private
use type Ada.Tags.Tag;
function Less (L, R : Object'Class) return Boolean is
(if L'Tag = R'Tag then L < R
else Ada.Tags.External_Tag (L'Tag) < Ada.Tags.External_Tag (R'Tag));
end GPR2.Build.Artifacts;