package p.packer.events; import p.packer.api.PackerProjectContext; import p.packer.api.events.PackerEvent; import p.packer.api.events.PackerEventKind; import p.packer.api.events.PackerEventSink; import p.packer.api.events.PackerProgress; import java.time.Instant; import java.util.List; import java.util.Objects; import java.util.UUID; public final class PackerOperationEventEmitter { private final PackerProjectContext project; private final PackerEventSink sink; private final String operationId; private long sequence; public PackerOperationEventEmitter(PackerProjectContext project, PackerEventSink sink) { this(project, sink, UUID.randomUUID().toString()); } public PackerOperationEventEmitter(PackerProjectContext project, PackerEventSink sink, String operationId) { this.project = Objects.requireNonNull(project, "project"); this.sink = Objects.requireNonNull(sink, "sink"); this.operationId = Objects.requireNonNull(operationId, "operationId").trim(); } public String operationId() { return operationId; } public void emit(PackerEventKind kind, String summary, List affectedAssets) { emit(kind, summary, null, affectedAssets); } public void emit(PackerEventKind kind, String summary, PackerProgress progress, List affectedAssets) { sink.publish(new PackerEvent( project.projectId(), operationId, sequence++, Objects.requireNonNull(kind, "kind"), Instant.now(), Objects.requireNonNull(summary, "summary"), progress, affectedAssets == null ? List.of() : List.copyOf(affectedAssets))); } }