View Javadoc
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  }