@@ -11,14 +11,16 @@ import (
1111
1212type Container struct {
1313 graph.Graph [resolver.DependencyResolver [any ]]
14- typeIndex map [reflect.Type ]* graph.Node [resolver.DependencyResolver [any ]]
15- connected bool
14+ typeIndex map [reflect.Type ]* graph.Node [resolver.DependencyResolver [any ]]
15+ tokenIndex map [string ]* graph.Node [resolver.DependencyResolver [any ]]
16+ connected bool
1617}
1718
1819func New () * Container {
1920 return & Container {
20- Graph : graph .NewGraph [resolver.DependencyResolver [any ]](),
21- typeIndex : make (map [reflect.Type ]* graph.Node [resolver.DependencyResolver [any ]]),
21+ Graph : graph .NewGraph [resolver.DependencyResolver [any ]](),
22+ typeIndex : make (map [reflect.Type ]* graph.Node [resolver.DependencyResolver [any ]]),
23+ tokenIndex : make (map [string ]* graph.Node [resolver.DependencyResolver [any ]]),
2224 }
2325}
2426
@@ -45,6 +47,28 @@ func (c *Container) AddDependency(res any) error {
4547 return nil
4648}
4749
50+ func (c * Container ) AddTokenDependency (token string , res any ) error {
51+ c .connected = false
52+ if ! resolver .IsValid (res ) {
53+ return errors .New ("invalid resolver" )
54+ }
55+
56+ builder := resolver.DependencyResolver [any ]{
57+ Resolver : res ,
58+ }
59+
60+ _ , exists := c .tokenIndex [token ]
61+ if exists {
62+ return fmt .Errorf ("dependency for token type already exists: %s" , token )
63+ }
64+
65+ node := graph .NewNode (builder )
66+ c .Add (node )
67+ c .tokenIndex [token ] = node
68+
69+ return nil
70+ }
71+
4872func (c * Container ) AddDependencies (resolvers ... any ) error {
4973 c .connected = false
5074 for _ , res := range resolvers {
@@ -157,3 +181,26 @@ func (c Container) resolve(t reflect.Type) (resolvedValue reflect.Value, err err
157181
158182 return resolver .Execute (dependencyResolver , inputArgs )
159183}
184+
185+ func (c Container ) resolveToken (token string ) (resolvedValue reflect.Value , err error ) {
186+ node , ok := c .tokenIndex [token ]
187+ if ! ok {
188+ err = fmt .Errorf ("dependency not found for token %s" , token )
189+ return
190+ }
191+
192+ dependencyResolver := node .Val
193+ inputTypes := dependencyResolver .Input ()
194+ inputArgs := []reflect.Value {}
195+
196+ for _ , inputType := range inputTypes {
197+ arg , err := c .resolve (inputType )
198+ if err != nil {
199+ return resolvedValue , err
200+ }
201+
202+ inputArgs = append (inputArgs , arg )
203+ }
204+
205+ return resolver .Execute (dependencyResolver , inputArgs )
206+ }
0 commit comments