Repository navigation
Description
wac-cli version 0.7.0
Components xml-converter and network-outgoing implement interfaces defined in the core package and use the record error-detail defined in the core-logic interface. wasm-tools shows that after building said components with the commands wasm-tools component wit xml-converter.wasm and wasm-tools component wit network-outgoing.wasm both import prototype:core/core-logic@0.1.0. However, the core component depends on the interfaces implemented by the xml-converter and network-outgoing components, which creates an import loop. While testing with WasmCloud and its runtime linking via wrpc, this didn't cause an issue, and everything worked fine. But trying to compose the components with WAC results in the resulting component importing prototype:core/core-logic@0.1.0. Can this be solved somehow?
core component:
package prototype:core@0.1.0;
interface core-logic {
enum error-code {
conversion-failed,
failed-to-get-product-list,
internal,
}
record error-detail {
code: error-code,
message: string,
}
get-product-list-csv: func(id: string, trace-id: string) -> result<list<u8>, error-detail>;
}
interface handler-outgoing {
use core-logic.{error-detail};
get-product-list: func(id: string, trace-id: string) -> result<list<u8>, error-detail>;
}
interface converter{
use core-logic.{error-detail};
convert: func(input: list<u8>, trace-id: string) -> result<list<u8>, error-detail>;
}
world core {
import converter;
import handler-outgoing;
export core-logic;
}
network-outgoing component:
package prototype:network-outgoing@0.1.0;
world network-outgoing {
import wasi:http/outgoing-handler@0.2.0;
export prototype:core/handler-outgoing@0.1.0;
}
xml-converter component:
package prototype:xml-converter@0.1.0;
world xml-converter {
export prototype:core/converter@0.1.0;
}
network-incoming component:
package prototype:network-incoming@0.1.0;
world network-incoming {
import prototype:core/core-logic@0.1.0;
export wasi:http/incoming-handler@0.2.0;
}
WAC file:
package prototype:app@0.1.0;
let network-outgoing = new prototype:network-outgoing {...};
let xml-converter = new prototype:xml-converter {...};
let core = new prototype:core {
converter: xml-converter.converter,
handler-outgoing: network-outgoing.handler-outgoing,
...
};
let network-incoming = new prototype:network-incoming {
core-logic: core.core-logic,
...
};
export network-incoming.incoming-handler;
Activity
[-]Import loop with ``use``[/-][+]Resolve import loop with ``use``[/+]Back0fnGurke commentedon Aug 6, 2025
The obvious fix is to define the error-detail record separately in each interface, but this leads to code duplication and increases the risk of inconsistencies if the definition isn’t updated consistently across all interfaces.