1 package com.guinetik.hexafun.hexa;
2
3 import java.util.Objects;
4
5 /**
6 * Type-safe key for adapter registration and invocation.
7 * Provides compile-time type checking for transformations between types.
8 *
9 * <p>Adapters transform data from one type to another, useful for:
10 * <ul>
11 * <li>Converting between use case input types</li>
12 * <li>Mapping domain objects to DTOs</li>
13 * <li>Transforming external data to internal representations</li>
14 * </ul>
15 *
16 * <p>Usage:
17 * <pre class="language-java">{@code
18 * // Define keys as constants
19 * public interface OrderAdapters {
20 * AdapterKey<OrderRequest, InventoryCheck> TO_INVENTORY =
21 * AdapterKey.of("orderToInventory");
22 * AdapterKey<OrderRequest, PaymentRequest> TO_PAYMENT =
23 * AdapterKey.of("orderToPayment");
24 * }
25 *
26 * // Register in DSL
27 * HexaFun.dsl()
28 * .withAdapter(TO_INVENTORY, req -> new InventoryCheck(req.itemId()))
29 * .withAdapter(TO_PAYMENT, req -> new PaymentRequest(req.total()))
30 * .useCase(...)
31 * .build();
32 *
33 * // Type-safe adaptation
34 * InventoryCheck check = app.adapt(TO_INVENTORY, orderRequest);
35 * }</pre>
36 *
37 * @param <From> The source type to adapt from
38 * @param <To> The target type to adapt to
39 */
40 public final class AdapterKey<From, To> {
41
42 private final String name;
43
44 private AdapterKey(String name) {
45 this.name = Objects.requireNonNull(
46 name,
47 "Adapter name cannot be null"
48 );
49 }
50
51 /**
52 * Create a new type-safe adapter key.
53 *
54 * @param name The unique name for this adapter
55 * @param <From> The source type
56 * @param <To> The target type
57 * @return A new AdapterKey instance
58 */
59 public static <From, To> AdapterKey<From, To> of(String name) {
60 return new AdapterKey<>(name);
61 }
62
63 /**
64 * Get the string name of this adapter key.
65 * @return The adapter name
66 */
67 public String name() {
68 return name;
69 }
70
71 @Override
72 public boolean equals(Object o) {
73 if (this == o) return true;
74 if (o == null || getClass() != o.getClass()) return false;
75 AdapterKey<?, ?> that = (AdapterKey<?, ?>) o;
76 return name.equals(that.name);
77 }
78
79 @Override
80 public int hashCode() {
81 return name.hashCode();
82 }
83
84 @Override
85 public String toString() {
86 return "AdapterKey(" + name + ")";
87 }
88 }