added contract update into asset workspace

This commit is contained in:
bQUARKz 2026-03-16 15:03:25 +00:00
parent bf4dc17469
commit b88a4e3c62
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
120 changed files with 1177 additions and 1211 deletions

View File

@ -9,12 +9,7 @@ import p.studio.compiler.source.identifiers.HostBindingId;
import p.studio.compiler.source.tables.HostBindingTable;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.*;
import java.util.regex.Pattern;
public final class PbsHostAdmissionValidator {

View File

@ -6,12 +6,7 @@ import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsBuiltinLayoutResolver;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.*;
import java.util.stream.Collectors;
public final class PbsReservedMetadataExtractor {

View File

@ -5,17 +5,17 @@ import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsSemanticsErrors;
import p.studio.compiler.source.diagnostics.DiagnosticPhase;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.NameId;
import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.identifiers.NameId;
import p.studio.compiler.source.tables.IntrinsicTable;
import p.studio.compiler.source.tables.NameTable;
import p.studio.utilities.structures.ReadOnlyList;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
import java.util.HashMap;
import java.util.Map;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
final class PbsExecutableBodyLowerer {
private final PbsExecutableCallsiteEmitter callsiteEmitter = new PbsExecutableCallsiteEmitter();
private final PbsExecutableStackAnalyzer stackAnalyzer = new PbsExecutableStackAnalyzer();

View File

@ -4,20 +4,16 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.identifiers.CallableId;
import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.tables.CallableShapeTable;
import p.studio.compiler.source.tables.CallableSignatureRef;
import p.studio.compiler.source.tables.CallableTable;
import p.studio.compiler.source.tables.NameTable;
import p.studio.compiler.source.tables.TypeSurfaceTable;
import p.studio.compiler.source.tables.*;
import p.studio.utilities.structures.ReadOnlyList;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
final class PbsExecutableCallableRegistryFactory {
private final PbsCallableShapeSurfaceService callableShapeSurfaceService = new PbsCallableShapeSurfaceService();

View File

@ -9,13 +9,13 @@ import p.studio.compiler.source.identifiers.NameId;
import p.studio.compiler.source.tables.NameTable;
import p.studio.utilities.structures.ReadOnlyList;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
final class PbsExecutableMetadataIndexFactory {
PbsExecutableMetadataIndex create(

View File

@ -3,11 +3,7 @@ package p.studio.compiler.pbs.lowering;
import p.studio.compiler.models.IRBackendExecutableFunction;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.*;
final class PbsExecutableStackAnalyzer {

View File

@ -1,7 +1,6 @@
package p.studio.compiler.pbs.parser;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.lexer.PbsToken;
import p.studio.compiler.pbs.lexer.PbsTokenKind;
import p.studio.compiler.source.Span;

View File

@ -5,13 +5,7 @@ import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.*;
public final class PbsBuiltinLayoutResolver {
private static final Set<String> BUILTIN_SCALAR_TYPES = Set.of("int", "float", "bool", "str");

View File

@ -1,18 +1,12 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.*;
final class PbsConstSemanticsValidator {
private final PbsFlowTypeOps typeOps = new PbsFlowTypeOps();

View File

@ -7,12 +7,7 @@ import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.tables.NameTable;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
public final class PbsDeclarationSemanticsValidator {
private static final String ATTR_HOST = "Host";

View File

@ -1,12 +1,8 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
final class PbsFlowAssignmentAnalyzer {
@FunctionalInterface

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.utilities.structures.ReadOnlyList;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.utilities.structures.ReadOnlyList;
final class PbsFlowBodyAnalyzer {
private final PbsFlowTypeOps typeOps = new PbsFlowTypeOps();

View File

@ -1,9 +1,9 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
final class PbsFlowBodyContext {
private final Scope scope;

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.Diagnostics;
final class PbsFlowBranchExpressionAnalyzer {
@FunctionalInterface

View File

@ -1,8 +1,8 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.utilities.structures.ReadOnlyList;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.utilities.structures.ReadOnlyList;
final class PbsFlowCallableBodyAnalyzer {
@FunctionalInterface

View File

@ -1,15 +1,10 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.CallableSymbol;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TupleField;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import java.util.ArrayList;

View File

@ -1,9 +1,9 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.source.diagnostics.Diagnostics;
import java.util.HashSet;

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.diagnostics.Diagnostics;
import java.util.HashSet;
import java.util.Set;

View File

@ -1,12 +1,8 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
final class PbsFlowExpressionAnalyzer {
@FunctionalInterface

View File

@ -1,10 +1,10 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
final class PbsFlowExpressionContext {
private final Scope scope;

View File

@ -1,13 +1,9 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
final class PbsFlowStatementAnalyzer {
@FunctionalInterface

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TupleField;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.Diagnostics;
import java.util.ArrayList;

View File

@ -1,20 +1,20 @@
package p.studio.compiler.pbs.stdlib;
import p.studio.compiler.models.SourceHandle;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.pbs.linking.PbsModuleVisibilityValidator;
import p.studio.compiler.pbs.parser.PbsBarrelParser;
import p.studio.compiler.pbs.parser.PbsParser;
import p.studio.compiler.source.tables.FileTable;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.models.SourceHandle;
import p.studio.compiler.source.tables.FileTable;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayList;
public final class InterfaceModuleLoader {
public InterfaceModuleLoader() {

View File

@ -14,13 +14,7 @@ import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.utilities.logs.LogAggregator;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.*;
@Slf4j
public class PBSFrontendPhaseService implements FrontendPhaseService {

View File

@ -2,20 +2,14 @@ package p.studio.compiler.services;
import p.studio.compiler.models.IRReservedMetadata;
import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.PbsReservedMetadataExtractor;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.identifiers.FileId;
import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.tables.ModuleTable;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
final class PbsImportedSemanticContextService {
private final PbsReservedMetadataExtractor reservedMetadataExtractor;

View File

@ -27,13 +27,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;
final class PbsModuleAssemblyService {
private final StdlibEnvironmentResolver stdlibEnvironmentResolver;

View File

@ -4,11 +4,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.messages.BuildingIssueSink;
import p.studio.compiler.messages.FrontendPhaseContext;
import p.studio.compiler.models.BuildStack;
import p.studio.compiler.models.IRBackend;
import p.studio.compiler.models.ProjectDescriptor;
import p.studio.compiler.models.SourceHandle;
import p.studio.compiler.models.SourceKind;
import p.studio.compiler.models.*;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.pbs.linking.PbsLinkErrors;
@ -37,11 +33,7 @@ import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsGateUSdkInterfaceConformanceTest {

View File

@ -28,10 +28,7 @@ import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsGateUStdlibCompileTest {

View File

@ -6,9 +6,7 @@ import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsBarrelParserTest {

View File

@ -6,10 +6,7 @@ import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsExprParserTest {

View File

@ -6,9 +6,7 @@ import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsParserStatementsTest {

View File

@ -8,10 +8,7 @@ import p.studio.compiler.source.identifiers.FileId;
import java.nio.charset.StandardCharsets;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsParserTest {

View File

@ -5,9 +5,7 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsSemanticsControlFlowTest {

View File

@ -5,9 +5,7 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsSemanticsDeclarationsTest {

View File

@ -5,9 +5,7 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PbsSemanticsFallthroughTest {

View File

@ -9,9 +9,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class InterfaceModuleLoaderTest {

View File

@ -9,12 +9,12 @@ import p.studio.compiler.models.ProjectDescriptor;
import p.studio.compiler.models.SourceHandle;
import p.studio.compiler.models.SourceKind;
import p.studio.compiler.pbs.PbsHostAdmissionErrors;
import p.studio.compiler.pbs.linking.PbsLinkErrors;
import p.studio.compiler.pbs.semantics.PbsSemanticsErrors;
import p.studio.compiler.pbs.stdlib.InterfaceModuleLoader;
import p.studio.compiler.pbs.stdlib.StdlibEnvironment;
import p.studio.compiler.pbs.stdlib.StdlibEnvironmentResolver;
import p.studio.compiler.pbs.stdlib.StdlibModuleSource;
import p.studio.compiler.pbs.linking.PbsLinkErrors;
import p.studio.compiler.pbs.semantics.PbsSemanticsErrors;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.source.tables.FileTable;
@ -29,12 +29,9 @@ import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class PBSFrontendPhaseServiceTest {

View File

@ -6,8 +6,8 @@ import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Objects;
public class BytecodeEmitter {

View File

@ -1,7 +1,6 @@
package p.studio.compiler.backend.irvm;
import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.compiler.backend.bytecode.BytecodeModule;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;

View File

@ -3,12 +3,7 @@ package p.studio.compiler.backend.irvm;
import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.*;
public class OptimizeIRVMService {
private final IRVMValidator validator;

View File

@ -6,10 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class BytecodeEmitterTest {

View File

@ -6,9 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
class BytecodeLinkPrecheckServiceTest {

View File

@ -6,9 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
class BytecodeModuleTest {

View File

@ -6,9 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
class BytecodePreloadVerifierServiceTest {

View File

@ -6,18 +6,10 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Locale;
import java.util.*;
import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.api.Assertions.*;
class IRVMIntrinsicRegistryParityTest {
private static final String VM_ARCH_INTRINSICS_PATH = "docs/vm-arch/INTRINSICS.csv";

View File

@ -8,9 +8,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.util.Map;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
class IRVMValidatorTest {
private final IRVMValidator validator = new IRVMValidator();

View File

@ -12,9 +12,7 @@ import p.studio.compiler.source.tables.IntrinsicReference;
import p.studio.compiler.source.tables.ModuleReference;
import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class LowerToIRVMServiceTest {

View File

@ -2,8 +2,8 @@ package p.studio.compiler.backend.irvm;
import org.junit.jupiter.api.Test;
import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.compiler.backend.bytecode.BytecodePreloadVerifierService;
import p.studio.compiler.backend.bytecode.BytecodeModule;
import p.studio.compiler.backend.bytecode.BytecodePreloadVerifierService;
import p.studio.compiler.models.IRBackend;
import p.studio.compiler.models.IRBackendExecutableFunction;
import p.studio.compiler.source.Span;
@ -16,12 +16,10 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class OptimizeIRVMEquivalenceHarnessTest {

View File

@ -9,11 +9,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class OptimizeIRVMServiceTest {

View File

@ -23,14 +23,9 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
class BackendGateIIntegrationTest {
private final RuntimeCompatibilityAdapter compatibilityAdapter = RuntimeCompatibilityAdapters.createDefault();

View File

@ -9,9 +9,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.api.Assertions.*;
class MainProjectPipelineIntegrationTest {

View File

@ -10,9 +10,7 @@ import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.api.Assertions.*;
class BackendConformanceMatrixSpecTest {
private static final String MATRIX_RELATIVE_PATH =

View File

@ -1,15 +1,7 @@
package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test;
import p.studio.compiler.workspaces.stages.EmitBytecodePipelineStage;
import p.studio.compiler.workspaces.stages.FrontendPhasePipelineStage;
import p.studio.compiler.workspaces.stages.LinkBytecodePipelineStage;
import p.studio.compiler.workspaces.stages.LoadSourcesPipelineStage;
import p.studio.compiler.workspaces.stages.LowerToIRVMPipelineStage;
import p.studio.compiler.workspaces.stages.OptimizeIRVMPipelineStage;
import p.studio.compiler.workspaces.stages.ResolveDepsPipelineStage;
import p.studio.compiler.workspaces.stages.VerifyBytecodePipelineStage;
import p.studio.compiler.workspaces.stages.WriteBytecodeArtifactPipelineStage;
import p.studio.compiler.workspaces.stages.*;
import java.lang.reflect.Field;
import java.util.List;

View File

@ -2,11 +2,7 @@ package p.studio.compiler.workspaces.stages;
import org.junit.jupiter.api.Test;
import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.compiler.backend.irvm.IRVMFunction;
import p.studio.compiler.backend.irvm.IRVMInstruction;
import p.studio.compiler.backend.irvm.IRVMModule;
import p.studio.compiler.backend.irvm.IRVMOp;
import p.studio.compiler.backend.irvm.IRVMProgram;
import p.studio.compiler.backend.irvm.*;
import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.compiler.models.IRBackend;
@ -17,9 +13,7 @@ import p.studio.compiler.source.identifiers.FileId;
import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class BackendSafetyGateSUTest {

View File

@ -8,10 +8,7 @@ import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class EmitBytecodePipelineStageTest {

View File

@ -11,10 +11,7 @@ import p.studio.compiler.source.identifiers.FileId;
import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class LowerToIRVMPipelineStageTest {

View File

@ -1,20 +1,13 @@
package p.studio.compiler.workspaces.stages;
import org.junit.jupiter.api.Test;
import p.studio.compiler.backend.irvm.IRVMFunction;
import p.studio.compiler.backend.irvm.IRVMInstruction;
import p.studio.compiler.backend.irvm.IRVMModule;
import p.studio.compiler.backend.irvm.IRVMOp;
import p.studio.compiler.backend.irvm.IRVMProgram;
import p.studio.compiler.backend.irvm.*;
import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class OptimizeIRVMPipelineStageTest {

View File

@ -11,10 +11,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class WriteBytecodeArtifactPipelineStageTest {

View File

@ -3,11 +3,7 @@ package p.studio.compiler.source.diagnostics;
import p.studio.compiler.source.Span;
import p.studio.utilities.structures.ReadOnlyCollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
public class DiagnosticSink implements ReadOnlyCollection<Diagnostic> {
private final ArrayList<Diagnostic> diagnostics = new ArrayList<>();

View File

@ -3,9 +3,6 @@ package p.studio.compiler.source.identifiers;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import java.util.Optional;
import java.util.function.Supplier;
@Getter
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public abstract class SourceIdentifier {

View File

@ -2,9 +2,7 @@ package p.studio.compiler.source.tables;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
class HostBindingTableTest {

View File

@ -2,9 +2,7 @@ package p.studio.compiler.source.tables;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class IntrinsicTableTest {

View File

@ -12,7 +12,8 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ValidatePhaseTest {

View File

@ -5,12 +5,7 @@ import lombok.Getter;
import p.studio.compiler.source.identifiers.CallableId;
import p.studio.compiler.source.identifiers.IntrinsicId;
import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.tables.CallableSignatureRef;
import p.studio.compiler.source.tables.CallableTable;
import p.studio.compiler.source.tables.IntrinsicReference;
import p.studio.compiler.source.tables.IntrinsicTable;
import p.studio.compiler.source.tables.ModuleReference;
import p.studio.compiler.source.tables.ModuleTable;
import p.studio.compiler.source.tables.*;
import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;

View File

@ -11,9 +11,7 @@ import p.studio.compiler.source.tables.IntrinsicReference;
import p.studio.compiler.source.tables.ModuleReference;
import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
class IRBackendExecutableContractTest {

View File

@ -1,11 +1,6 @@
package p.studio.utilities.structures;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
import java.util.*;
import java.util.stream.Stream;
public interface ReadOnlyList<T> extends ReadOnlyCollection<T> {

View File

@ -18,4 +18,6 @@ public interface PackerWorkspaceService {
MoveAssetResult moveAsset(MoveAssetRequest request);
DeleteAssetResult deleteAsset(DeleteAssetRequest request);
UpdateAssetContractResponse updateAssetContract(UpdateAssetContractRequest request);
}

View File

@ -1,6 +1,7 @@
package p.packer.dtos;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path;
import java.util.List;
@ -9,7 +10,7 @@ import java.util.Objects;
public record PackerAssetDetailsDTO(
PackerAssetSummaryDTO summary,
String outputFormat,
OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec,
List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec,
@ -18,7 +19,7 @@ public record PackerAssetDetailsDTO(
public PackerAssetDetailsDTO {
Objects.requireNonNull(summary, "summary");
outputFormat = Objects.requireNonNullElse(outputFormat, "unknown").trim();
outputFormat = Objects.requireNonNullElse(outputFormat, OutputFormatCatalog.UNKNOWN);
outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN);
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));

View File

@ -0,0 +1,21 @@
package p.packer.messages;
import p.packer.messages.assets.OutputCodecCatalog;
import java.util.Map;
import java.util.Objects;
public record UpdateAssetContractRequest(
PackerProjectContext project,
AssetReference assetReference,
boolean preloadEnabled,
OutputCodecCatalog outputCodec,
Map<String, String> codecFieldValues) {
public UpdateAssetContractRequest {
Objects.requireNonNull(project, "project");
Objects.requireNonNull(assetReference, "assetReference");
outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN);
codecFieldValues = Map.copyOf(Objects.requireNonNullElse(codecFieldValues, Map.of()));
}
}

View File

@ -0,0 +1,4 @@
package p.packer.messages;
public record UpdateAssetContractResponse(boolean success, String errorMessage) {
}

View File

@ -1,7 +1,9 @@
package p.packer.models;
import org.apache.commons.lang3.StringUtils;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.util.List;
import java.util.Map;
@ -13,7 +15,7 @@ public record PackerAssetDeclaration(
String name,
AssetFamilyCatalog assetFamily,
Map<String, List<String>> inputsByRole,
String outputFormat,
OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec,
boolean preloadEnabled) {
@ -25,9 +27,9 @@ public record PackerAssetDeclaration(
name = Objects.requireNonNull(name, "name").trim();
assetFamily = Objects.requireNonNull(assetFamily, "assetFamily");
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
outputFormat = Objects.requireNonNull(outputFormat, "outputFormat").trim();
outputFormat = Objects.requireNonNull(outputFormat, "outputFormat");
outputCodec = Objects.requireNonNull(outputCodec, "outputCodec");
if (assetUuid.isBlank() || name.isBlank() || outputFormat.isBlank()) {
if (StringUtils.isBlank(assetUuid) || StringUtils.isBlank(name)) {
throw new IllegalArgumentException("declaration fields must not be blank");
}
}

View File

@ -1,6 +1,7 @@
package p.packer.models;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path;
import java.util.List;
@ -9,7 +10,7 @@ import java.util.Objects;
public record PackerAssetDetails(
PackerAssetSummary summary,
String outputFormat,
OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec,
List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationField>> codecConfigurationFieldsByCodec,
@ -18,7 +19,7 @@ public record PackerAssetDetails(
public PackerAssetDetails {
Objects.requireNonNull(summary, "summary");
outputFormat = Objects.requireNonNullElse(outputFormat, "unknown").trim();
outputFormat = Objects.requireNonNullElse(outputFormat, OutputFormatCatalog.UNKNOWN);
outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN);
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));

View File

@ -1,7 +1,7 @@
package p.packer.models;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;

View File

@ -10,11 +10,7 @@ import p.packer.models.PackerRegistryState;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
public final class FileSystemPackerRegistryRepository implements PackerRegistryRepository {
private static final ObjectMapper MAPPER = new ObjectMapper();

View File

@ -1,46 +1,17 @@
package p.packer.services;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.GetAssetActionsRequest;
import p.packer.messages.GetAssetActionsResult;
import p.packer.messages.MoveAssetRequest;
import p.packer.messages.MoveAssetResult;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import com.fasterxml.jackson.databind.node.ObjectNode;
import p.packer.PackerWorkspaceService;
import p.packer.events.PackerEventKind;
import p.packer.events.PackerEventSink;
import p.packer.events.PackerProgress;
import p.packer.messages.CreateAssetRequest;
import p.packer.messages.CreateAssetResult;
import p.packer.messages.DeleteAssetRequest;
import p.packer.messages.DeleteAssetResult;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.GetAssetDetailsResult;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.InitWorkspaceResult;
import p.packer.messages.ListAssetsRequest;
import p.packer.messages.ListAssetsResult;
import p.packer.messages.RegisterAssetRequest;
import p.packer.messages.RegisterAssetResult;
import p.packer.PackerWorkspaceService;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerDeleteAssetEvaluation;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerMoveAssetEvaluation;
import p.packer.models.PackerRegisterAssetEvaluation;
import p.packer.models.PackerAssetSummary;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import p.packer.messages.*;
import p.packer.messages.assets.*;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.*;
import java.io.IOException;
import java.nio.file.Files;
@ -115,7 +86,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
events.emit(
PackerEventKind.ASSET_DISCOVERED,
"Discovered asset: " + summary.identity().assetName(),
new PackerProgress(total == 0 ? 1.0d : (index + 1) / (double) total, false),
new PackerProgress((index + 1) / (double) total, false),
List.of(summary.identity().assetName()));
}
@ -405,9 +376,9 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
sourceRoot,
targetRoot,
targetManifestPath));
final AssetReference canonicalReference = updatedEntry.isPresent()
? AssetReference.forAssetId(updatedEntry.get().assetId())
: AssetReference.forRelativeAssetRoot(targetRelativeRoot);
final AssetReference canonicalReference = updatedEntry
.map(packerRegistryEntry -> AssetReference.forAssetId(packerRegistryEntry.assetId()))
.orElseGet(() -> AssetReference.forRelativeAssetRoot(targetRelativeRoot));
final MoveAssetResult result = new MoveAssetResult(
PackerOperationStatus.SUCCESS,
"Asset moved: " + sourceRelativeRoot + " -> " + targetRelativeRoot,
@ -603,4 +574,111 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
.toList();
return registry.withAssets(updatedEntries, registry.nextAssetId());
}
@Override
public UpdateAssetContractResponse updateAssetContract(final UpdateAssetContractRequest request) {
final UpdateAssetContractRequest safeRequest = Objects.requireNonNull(request, "request");
final PackerProjectContext project = safeRequest.project();
return writeCoordinator.execute(project, () -> updateAssetContractInWriteLane(safeRequest));
}
private UpdateAssetContractResponse updateAssetContractInWriteLane(UpdateAssetContractRequest request) {
final PackerProjectContext project = request.project();
workspaceFoundation.initWorkspace(new InitWorkspaceRequest(project));
final PackerRuntimeSnapshot snapshot = runtimeRegistry.getOrLoad(project).snapshot();
final PackerDeleteAssetEvaluation evaluation = actionReadService.evaluateDelete(snapshot, project, request.assetReference());
if (!evaluation.canDelete()) {
return new UpdateAssetContractResponse(
false,
Objects.requireNonNullElse(evaluation.reason(), "Asset contract cannot be updated."));
}
if (request.outputCodec() == OutputCodecCatalog.UNKNOWN) {
return new UpdateAssetContractResponse(false, "Output codec is required.");
}
final Path assetRoot = evaluation.resolved().assetRoot();
final Path manifestPath = assetRoot.resolve("asset.json");
if (!Files.isRegularFile(manifestPath)) {
return new UpdateAssetContractResponse(false, "asset.json was not found for the requested asset root.");
}
final ObjectNode manifest;
try {
final JsonNode rawManifest = MAPPER.readTree(manifestPath.toFile());
if (!(rawManifest instanceof ObjectNode objectNode)) {
return new UpdateAssetContractResponse(false, "asset.json must contain a JSON object at the root.");
}
manifest = objectNode;
} catch (IOException exception) {
return new UpdateAssetContractResponse(false, "Unable to read asset manifest: " + exception.getMessage());
}
final OutputFormatCatalog outputFormat = resolveManifestOutputFormat(manifest);
if (outputFormat == OutputFormatCatalog.UNKNOWN) {
return new UpdateAssetContractResponse(false, "Output format is missing or invalid in asset.json.");
}
if (!outputFormat.supports(request.outputCodec())) {
return new UpdateAssetContractResponse(false, "Output codec is not supported for the selected output format.");
}
try {
patchManifestContract(manifest, request);
MAPPER.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
runtimeRegistry.update(project, (currentSnapshot, generation) -> runtimePatchService.afterUpdateAssetContract(
currentSnapshot,
generation,
assetRoot,
manifestPath,
evaluation.resolved().registryEntry()));
return new UpdateAssetContractResponse(true, null);
} catch (IOException exception) {
return new UpdateAssetContractResponse(false, "Unable to update asset contract: " + exception.getMessage());
} catch (RuntimeException exception) {
return new UpdateAssetContractResponse(false, "Unable to update runtime snapshot: " + exception.getMessage());
}
}
private OutputFormatCatalog resolveManifestOutputFormat(ObjectNode manifest) {
final JsonNode outputNode = manifest.get("output");
if (!(outputNode instanceof ObjectNode outputObject)) {
return OutputFormatCatalog.UNKNOWN;
}
final JsonNode formatNode = outputObject.get("format");
if (formatNode == null || !formatNode.isTextual()) {
return OutputFormatCatalog.UNKNOWN;
}
return OutputFormatCatalog.fromManifestValue(formatNode.asText());
}
private void patchManifestContract(ObjectNode manifest, UpdateAssetContractRequest request) {
final ObjectNode preloadNode = mutableObject(manifest, "preload");
preloadNode.put("enabled", request.preloadEnabled());
final ObjectNode outputNode = mutableObject(manifest, "output");
outputNode.put("codec", request.outputCodec().manifestValue());
final ObjectNode codecConfigurationNode = mutableObject(outputNode, "codec_configuration");
codecConfigurationNode.removeAll();
final String selectedCodecPrefix = request.outputCodec().name() + ":";
request.codecFieldValues().forEach((fieldKey, fieldValue) -> {
if (fieldKey == null || fieldKey.isBlank() || !fieldKey.startsWith(selectedCodecPrefix)) {
return;
}
final String normalizedFieldKey = fieldKey.substring(selectedCodecPrefix.length()).trim();
if (normalizedFieldKey.isBlank()) {
return;
}
codecConfigurationNode.put(normalizedFieldKey, Objects.requireNonNullElse(fieldValue, ""));
});
}
private ObjectNode mutableObject(ObjectNode parent, String fieldName) {
final JsonNode current = parent.get(fieldName);
if (current instanceof ObjectNode objectNode) {
return objectNode;
}
final ObjectNode created = MAPPER.createObjectNode();
parent.set(fieldName, created);
return created;
}
}

View File

@ -1,24 +1,10 @@
package p.packer.services;
import p.packer.messages.AssetReference;
import p.packer.messages.GetAssetActionsRequest;
import p.packer.messages.GetAssetActionsResult;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.*;
import p.packer.messages.assets.AssetAction;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerAssetActionAvailability;
import p.packer.models.PackerAssetDeclaration;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerDeleteAssetEvaluation;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerMoveAssetEvaluation;
import p.packer.models.PackerRegisterAssetEvaluation;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerResolvedAssetReference;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import p.packer.models.*;
import java.nio.file.Path;
import java.util.ArrayList;

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerAssetDeclaration;
@ -12,11 +13,7 @@ import p.packer.models.PackerDiagnostic;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
public final class PackerAssetDeclarationParser {
private static final ObjectMapper MAPPER = new ObjectMapper();
@ -43,7 +40,7 @@ public final class PackerAssetDeclarationParser {
final String name = requiredText(root, "name", diagnostics, manifestPath);
final AssetFamilyCatalog assetFamily = requiredAssetFamily(root, diagnostics, manifestPath);
final Map<String, List<String>> inputsByRole = requiredInputs(root.path("inputs"), diagnostics, manifestPath);
final String outputFormat = requiredText(root.path("output"), "format", diagnostics, manifestPath);
final OutputFormatCatalog outputFormat = requiredOutputFormat(root.path("output"), diagnostics, manifestPath);
final OutputCodecCatalog outputCodec = requiredOutputCodec(root.path("output"), diagnostics, manifestPath);
final Boolean preloadEnabled = requiredBoolean(root.path("preload"), "enabled", diagnostics, manifestPath);
@ -118,6 +115,24 @@ public final class PackerAssetDeclarationParser {
return field.booleanValue();
}
private OutputFormatCatalog requiredOutputFormat(JsonNode node, List<PackerDiagnostic> diagnostics, Path manifestPath) {
final String fmtValue = requiredText(node, "format", diagnostics, manifestPath);
if (fmtValue == null) {
return null;
}
final OutputFormatCatalog outputFormat = OutputFormatCatalog.fromManifestValue(fmtValue);
if (outputFormat == OutputFormatCatalog.UNKNOWN) {
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Field 'output' must have a valid value.",
manifestPath,
true));
return null;
}
return outputFormat;
}
private OutputCodecCatalog requiredOutputCodec(JsonNode node, List<PackerDiagnostic> diagnostics, Path manifestPath) {
final String codecValue = requiredText(node, "codec", diagnostics, manifestPath);
if (codecValue == null) {
@ -128,7 +143,7 @@ public final class PackerAssetDeclarationParser {
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Field 'codec' must be one of: NONE.",
"Field 'codec' must have a valid value.",
manifestPath,
true));
return null;

View File

@ -1,34 +1,13 @@
package p.packer.services;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.*;
import p.packer.messages.assets.*;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.GetAssetDetailsResult;
import p.packer.models.PackerAssetDeclaration;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerAssetDetails;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerAssetSummary;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerResolvedAssetReference;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import p.packer.models.*;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
public final class PackerAssetDetailsService {
private final PackerRuntimeRegistry runtimeRegistry;
@ -126,7 +105,7 @@ public final class PackerAssetDetailsService {
true);
final PackerAssetDetails details = new PackerAssetDetails(
summary,
"unknown",
OutputFormatCatalog.UNKNOWN,
OutputCodecCatalog.UNKNOWN,
List.of(OutputCodecCatalog.NONE),
Map.of(OutputCodecCatalog.NONE, List.of()),

View File

@ -4,11 +4,7 @@ import p.packer.messages.AssetReference;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerResolvedAssetReference;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import p.packer.models.*;
import java.nio.file.Path;
import java.util.List;

View File

@ -1,10 +1,10 @@
package p.packer.services;
import p.packer.messages.PackerProjectContext;
import p.packer.events.PackerEvent;
import p.packer.events.PackerEventKind;
import p.packer.events.PackerEventSink;
import p.packer.events.PackerProgress;
import p.packer.messages.PackerProjectContext;
import java.time.Instant;
import java.util.List;

View File

@ -3,18 +3,14 @@ package p.packer.services;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.models.PackerCodecConfigurationField;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
final class PackerOutputContractCatalog {
private PackerOutputContractCatalog() {
}
static OutputContractDefinition definitionFor(String outputFormat, OutputCodecCatalog selectedCodec) {
static OutputContractDefinition definitionFor(OutputFormatCatalog outputFormat, OutputCodecCatalog selectedCodec) {
final List<OutputCodecCatalog> availableCodecs = availableCodecsFor(outputFormat, selectedCodec);
return new OutputContractDefinition(
availableCodecs,
@ -25,13 +21,12 @@ final class PackerOutputContractCatalog {
java.util.LinkedHashMap::new)));
}
static List<OutputCodecCatalog> availableCodecsFor(String outputFormat, OutputCodecCatalog selectedCodec) {
static List<OutputCodecCatalog> availableCodecsFor(OutputFormatCatalog outputFormat, OutputCodecCatalog selectedCodec) {
final Set<OutputCodecCatalog> codecs = new LinkedHashSet<>();
final OutputFormatCatalog formatCatalog = OutputFormatCatalog.fromManifestValue(outputFormat);
if (formatCatalog != OutputFormatCatalog.UNKNOWN) {
codecs.addAll(formatCatalog.availableCodecs());
if (outputFormat != OutputFormatCatalog.UNKNOWN) {
codecs.addAll(outputFormat.availableCodecs());
} else {
final String normalizedFormat = Objects.requireNonNullElse(outputFormat, "").trim().toUpperCase(Locale.ROOT);
final String normalizedFormat = outputFormat.manifestValue().trim().toUpperCase(Locale.ROOT);
if (normalizedFormat.startsWith("TILES/")
|| normalizedFormat.startsWith("PALETTE/")
|| normalizedFormat.startsWith("SOUND/")
@ -51,7 +46,7 @@ final class PackerOutputContractCatalog {
return List.copyOf(codecs);
}
private static List<PackerCodecConfigurationField> fieldsFor(String outputFormat, OutputCodecCatalog codec) {
private static List<PackerCodecConfigurationField> fieldsFor(OutputFormatCatalog outputFormat, OutputCodecCatalog codec) {
return List.of();
}

View File

@ -5,15 +5,7 @@ import p.packer.messages.PackerProjectContext;
import java.io.Closeable;
import java.nio.file.Path;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public final class PackerProjectWriteCoordinator implements Closeable {

View File

@ -1,18 +1,8 @@
package p.packer.services;
import p.packer.dtos.PackerAssetDetailsDTO;
import p.packer.dtos.PackerAssetActionAvailabilityDTO;
import p.packer.dtos.PackerAssetIdentityDTO;
import p.packer.dtos.PackerAssetSummaryDTO;
import p.packer.dtos.PackerCodecConfigurationFieldDTO;
import p.packer.dtos.PackerDiagnosticDTO;
import p.packer.dtos.*;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.models.PackerAssetActionAvailability;
import p.packer.models.PackerAssetDetails;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerAssetSummary;
import p.packer.models.PackerCodecConfigurationField;
import p.packer.models.PackerDiagnostic;
import p.packer.models.*;
import java.util.List;
import java.util.Map;

View File

@ -1,7 +1,7 @@
package p.packer.services;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;
import p.packer.models.PackerRuntimeAsset;
@ -10,12 +10,7 @@ import p.packer.models.PackerRuntimeSnapshot;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

View File

@ -1,17 +1,9 @@
package p.packer.services;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import p.packer.models.*;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
public final class PackerRuntimePatchService {
private final PackerAssetDeclarationParser declarationParser;
@ -81,7 +73,7 @@ public final class PackerRuntimePatchService {
PackerRuntimeSnapshot snapshot,
long generation,
PackerRegistryState updatedRegistry,
java.util.Optional<PackerRegistryEntry> updatedRegistryEntry,
Optional<PackerRegistryEntry> updatedRegistryEntry,
Path sourceRoot,
Path targetRoot,
Path targetManifestPath) {
@ -106,4 +98,36 @@ public final class PackerRuntimePatchService {
updatedAssets.sort(Comparator.comparing(asset -> asset.assetRoot().toString(), String.CASE_INSENSITIVE_ORDER));
return new PackerRuntimeSnapshot(generation, updatedRegistry, updatedAssets);
}
public PackerRuntimeSnapshot afterUpdateAssetContract(
PackerRuntimeSnapshot snapshot,
long generation,
Path assetRoot,
Path manifestPath,
Optional<PackerRegistryEntry> registryEntry) {
final PackerAssetDeclarationParseResult parsed = declarationParser.parse(manifestPath);
final List<PackerRuntimeAsset> updatedAssets = new ArrayList<>();
boolean patched = false;
for (PackerRuntimeAsset asset : snapshot.assets()) {
if (asset.assetRoot().equals(assetRoot.toAbsolutePath().normalize())) {
updatedAssets.add(new PackerRuntimeAsset(
asset.assetRoot(),
asset.manifestPath(),
asset.registryEntry(),
parsed));
patched = true;
} else {
updatedAssets.add(asset);
}
}
if (!patched) {
updatedAssets.add(new PackerRuntimeAsset(
assetRoot,
manifestPath,
registryEntry,
parsed));
updatedAssets.sort(Comparator.comparing(asset -> asset.assetRoot().toString(), String.CASE_INSENSITIVE_ORDER));
}
return new PackerRuntimeSnapshot(generation, snapshot.registry(), updatedAssets);
}
}

View File

@ -4,12 +4,12 @@ import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRuntimeSnapshot;
import java.nio.file.Path;
import java.util.function.BiFunction;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiFunction;
public final class PackerRuntimeRegistry {
private final PackerRuntimeSnapshotLoader loader;

View File

@ -1,9 +1,9 @@
package p.packer.services;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.InitWorkspaceResult;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -1,29 +1,12 @@
package p.packer.services;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.assets.PackerAssetState;
import p.packer.events.PackerEvent;
import p.packer.events.PackerEventKind;
import p.packer.messages.CreateAssetRequest;
import p.packer.messages.CreateAssetResult;
import p.packer.messages.DeleteAssetRequest;
import p.packer.messages.DeleteAssetResult;
import p.packer.messages.GetAssetActionsRequest;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.ListAssetsRequest;
import p.packer.messages.MoveAssetRequest;
import p.packer.messages.MoveAssetResult;
import p.packer.messages.RegisterAssetRequest;
import p.packer.messages.RegisterAssetResult;
import p.packer.messages.assets.AssetAction;
import p.packer.messages.*;
import p.packer.messages.assets.*;
import p.packer.testing.PackerFixtureLocator;
import java.nio.file.Files;
@ -31,6 +14,7 @@ import java.nio.file.Path;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@ -38,6 +22,8 @@ import java.util.concurrent.Future;
import static org.junit.jupiter.api.Assertions.*;
final class FileSystemPackerWorkspaceServiceTest {
private static final ObjectMapper MAPPER = new ObjectMapper();
@TempDir
Path tempDir;
@ -193,6 +179,77 @@ final class FileSystemPackerWorkspaceServiceTest {
assertEquals(2, loader.loadCount());
}
@Test
void updatesAssetContractManifestAndReturnsSuccess() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("update-contract-success"));
final FileSystemPackerWorkspaceService service = service();
final var result = service.updateAssetContract(new UpdateAssetContractRequest(
project(projectRoot),
AssetReference.forAssetId(1),
false,
OutputCodecCatalog.NONE,
Map.of(
"NONE:packMode", "tight",
"NONE:palette", "mono")));
assertTrue(result.success());
assertNull(result.errorMessage());
final Path manifestPath = projectRoot.resolve("assets/ui/atlas/asset.json");
final var manifest = MAPPER.readTree(manifestPath.toFile());
assertFalse(manifest.path("preload").path("enabled").asBoolean(true));
assertEquals("NONE", manifest.path("output").path("codec").asText());
assertEquals("tight", manifest.path("output").path("codec_configuration").path("packMode").asText());
assertEquals("mono", manifest.path("output").path("codec_configuration").path("palette").asText());
}
@Test
void updateAssetContractPatchesLoadedSnapshotWithoutWholeProjectReload() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("update-contract-no-reload"));
final CountingLoader loader = countingLoader();
final FileSystemPackerWorkspaceService service = service(ignored -> { }, loader);
service.listAssets(new ListAssetsRequest(project(projectRoot)));
assertEquals(1, loader.loadCount());
final var updateResult = service.updateAssetContract(new UpdateAssetContractRequest(
project(projectRoot),
AssetReference.forAssetId(1),
false,
OutputCodecCatalog.NONE,
Map.of("NONE:packMode", "tight")));
assertTrue(updateResult.success());
assertEquals(1, loader.loadCount());
final var detailsResult = service.getAssetDetails(new GetAssetDetailsRequest(
project(projectRoot),
AssetReference.forAssetId(1)));
assertEquals(PackerOperationStatus.SUCCESS, detailsResult.status());
assertFalse(detailsResult.details().summary().preloadEnabled());
assertEquals(OutputCodecCatalog.NONE, detailsResult.details().outputCodec());
assertEquals(1, loader.loadCount());
}
@Test
void returnsFailureWhenAssetManifestIsMissingOnContractUpdate() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("update-contract-missing-manifest"));
Files.delete(projectRoot.resolve("assets/ui/atlas/asset.json"));
final FileSystemPackerWorkspaceService service = service();
final var result = service.updateAssetContract(new UpdateAssetContractRequest(
project(projectRoot),
AssetReference.forAssetId(1),
true,
OutputCodecCatalog.NONE,
Map.of()));
assertFalse(result.success());
assertNotNull(result.errorMessage());
assertTrue(result.errorMessage().contains("asset.json was not found"));
}
@Test
void exposesRegisterActionForValidUnregisteredAsset() throws Exception {
final Path projectRoot = copyFixture("workspaces/orphan-valid", tempDir.resolve("orphan-actions"));

View File

@ -28,7 +28,7 @@ final class PackerAssetDeclarationParserTest {
assertEquals("fixture-uuid-1", result.declaration().assetUuid());
assertEquals("ui_atlas", result.declaration().name());
assertEquals(AssetFamilyCatalog.IMAGE_BANK, result.declaration().assetFamily());
assertEquals("TILES/indexed_v1", result.declaration().outputFormat());
assertEquals("TILES/indexed_v1", result.declaration().outputFormat().displayName());
assertEquals(OutputCodecCatalog.NONE, result.declaration().outputCodec());
assertTrue(result.declaration().preloadEnabled());
}

View File

@ -2,13 +2,13 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.messages.AssetReference;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.testing.PackerFixtureLocator;
import java.nio.file.Files;
@ -34,7 +34,7 @@ final class PackerAssetDetailsServiceTest {
assertEquals(PackerBuildParticipation.INCLUDED, result.details().summary().buildParticipation());
assertEquals("fixture-uuid-1", result.details().summary().identity().assetUuid());
assertEquals("ui_atlas", result.details().summary().identity().assetName());
assertEquals("TILES/indexed_v1", result.details().outputFormat());
assertEquals("TILES/indexed_v1", result.details().outputFormat().displayName());
assertEquals(List.of(OutputCodecCatalog.NONE), result.details().availableOutputCodecs());
assertEquals(List.of(), result.details().codecConfigurationFieldsByCodec().get(OutputCodecCatalog.NONE));
assertTrue(result.diagnostics().isEmpty());

View File

@ -2,8 +2,8 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -55,4 +55,10 @@ public final class StudioFormSession<T> {
resetDraft();
mode = StudioFormMode.READ_ONLY;
}
public T apply() {
source = draft;
mode = StudioFormMode.READ_ONLY;
return source;
}
}

View File

@ -15,11 +15,11 @@ import p.studio.controls.lifecycle.StudioControlLifecycle;
import p.studio.controls.lifecycle.StudioControlLifecycleSupport;
import p.studio.events.*;
import p.studio.projects.ProjectReference;
import p.studio.utilities.events.EventSubscription;
import p.studio.utilities.i18n.I18n;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent;
import p.studio.utilities.events.EventSubscription;
import p.studio.utilities.i18n.I18n;
import java.util.ArrayList;
import java.util.List;

View File

@ -5,12 +5,7 @@ import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.*;
public final class KnownProjectsService {
private final Path storageFile;

View File

@ -15,20 +15,12 @@ import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;
import p.studio.Container;
import p.studio.projects.ProjectCatalogService;
import p.studio.projects.ProjectCreationRequest;
import p.studio.projects.ProjectLanguageCatalogService;
import p.studio.projects.ProjectLanguageTemplate;
import p.studio.projects.ProjectReference;
import p.studio.projects.*;
import p.studio.utilities.i18n.I18n;
import java.io.File;
import java.nio.file.Path;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
public final class NewProjectWizard {

View File

@ -7,12 +7,8 @@ import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
import p.studio.Container;
import p.studio.projects.KnownProjectsService;

View File

@ -6,13 +6,7 @@ import javafx.stage.Stage;
import javafx.stage.StageStyle;
import p.packer.messages.InitWorkspaceRequest;
import p.studio.Container;
import p.studio.events.StudioProjectLoadingCompletedEvent;
import p.studio.events.StudioProjectLoadingFailedEvent;
import p.studio.events.StudioProjectLoadingPhase;
import p.studio.events.StudioProjectLoadingProgressEvent;
import p.studio.events.StudioProjectLoadingStartedEvent;
import p.studio.events.StudioProjectCreatedEvent;
import p.studio.events.StudioProjectOpenedEvent;
import p.studio.events.*;
import p.studio.projects.KnownProjectsService;
import p.studio.projects.ProjectCatalogService;
import p.studio.projects.ProjectReference;

View File

@ -5,6 +5,7 @@ import p.studio.events.StudioPackerOperationEvent;
import p.studio.events.StudioWorkspaceEventBus;
import p.studio.utilities.i18n.I18n;
import p.studio.utilities.logspane.LogsPane;
import p.studio.workspaces.assets.messages.events.StudioAssetLogEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent;
@ -29,6 +30,9 @@ public final class AssetLogsPane extends LogsPane implements StudioEventAware {
@Override
public void registerEventSubscriptions() {
eventBindings.listen(workspaceBus, StudioAssetLogEvent.class).handle(event -> {
appendLine("[" + event.source() + "] " + event.message());
});
eventBindings.listen(workspaceBus, StudioAssetsWorkspaceRefreshStartedEvent.class).handle(event -> {
appendLine("[refresh] Asset scan started.");
});

View File

@ -60,7 +60,7 @@ public final class AssetDetailsControl extends VBox implements StudioEventAware
this.projectReference = Objects.requireNonNull(projectReference, "projectReference");
this.workspaceBus = Objects.requireNonNull(workspaceBus, "workspaceBus");
this.summaryControl = new AssetDetailsSummaryControl(projectReference, workspaceBus);
this.contractControl = new AssetDetailsContractControl(workspaceBus);
this.contractControl = new AssetDetailsContractControl(projectReference, workspaceBus);
this.actionsSection = createActionsSection();
getStyleClass().add("assets-workspace-pane");

View File

@ -9,6 +9,7 @@ import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import p.packer.messages.assets.AssetAction;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.studio.Container;
import p.studio.projects.ProjectReference;
import p.studio.utilities.i18n.I18n;
@ -44,6 +45,13 @@ public final class AssetDetailsUiSupport {
return createKeyValueRow(key, valueLabel);
}
public static Node createKeyValueRow(String key, OutputFormatCatalog outputFormat) {
final Label valueLabel = new Label(outputFormat.displayName());
valueLabel.getStyleClass().add("assets-details-value");
valueLabel.setWrapText(true);
return createKeyValueRow(key, valueLabel);
}
public static Node createKeyValueRow(String key, Node valueNode) {
final HBox row = new HBox(12);
row.setAlignment(Pos.TOP_LEFT);

Some files were not shown because too many files have changed in this diff Show More