Skip to content
This repository was archived by the owner on Jul 15, 2026. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions definitions/type.DependencyCollection.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package definitions

import (
"reflect"

"github.com/MY-RV/gosc/enums/scopeStatus"
)

type DependencyCollection interface {
GetDependencyFactory(reflect.Type) (Factory, error)
GetRegisteredDependencies() []reflect.Type
GetScopeStatus() scopeStatus.Enum

GetDependency(reflect.Type) (any, error)
MustGetDependency(reflect.Type) any
}
12 changes: 12 additions & 0 deletions definitions/type.DependencyCollectionBuilder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package definitions

import "github.com/MY-RV/gosc/enums/scope"

type DependencyCollectionBuilder interface {
AddDependency(scope.Enum, Factory)
AddSingleton(Factory)
AddTransient(Factory)
AddScoped(Factory)

Build() DependencyCollection
}
10 changes: 10 additions & 0 deletions definitions/type.DependencyRecord.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package definitions

import (
"github.com/MY-RV/gosc/enums/scope"
)

type DependencyRecord interface {
GetFactory() Factory
GetScope() scope.Enum
}
8 changes: 8 additions & 0 deletions definitions/type.Factory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package definitions

import "reflect"

type Factory interface {
GetFactoryType() reflect.Type
Create(DependencyCollection) any
}
6 changes: 6 additions & 0 deletions definitions/type.TypedFactory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package definitions

type TypedFactory[T any] interface {
Factory
TypedCreate(DependencyCollection) T
}
1 change: 1 addition & 0 deletions enums/scope/enum.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ type Enum int

const (
SINGLETON Enum = iota
TRANSIENT
SCOPED
)
2 changes: 1 addition & 1 deletion enums/scope_status/enum.go → enums/scopeStatus/enum.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package scope_status
package scopeStatus

type Enum int

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package scope_status
package scopeStatus

import "testing"

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dependencyCollection

import "reflect"

// GetDependency implements definitions.DependencyCollection.
func (d *dependencyCollection) GetDependency(reflect.Type) (any, error) {
panic("unimplemented")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package dependencyCollection

import (
"reflect"

"github.com/MY-RV/gosc/definitions"
)

// GetDependencyFactory implements definitions.DependencyCollection.
func (d *dependencyCollection) GetDependencyFactory(reflect.Type) (definitions.Factory, error) {
panic("unimplemented")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dependencyCollection

import "reflect"

// GetRegisteredDependencies implements definitions.DependencyCollection.
func (d *dependencyCollection) GetRegisteredDependencies() []reflect.Type {
panic("unimplemented")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dependencyCollection

import "github.com/MY-RV/gosc/enums/scopeStatus"

// GetScopeStatus implements definitions.DependencyCollection.
func (d *dependencyCollection) GetScopeStatus() scopeStatus.Enum {
return d.scopeStatus
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dependencyCollection

import "reflect"

// MustGetDependency implements definitions.DependencyCollection.
func (d *dependencyCollection) MustGetDependency(reflect.Type) any {
panic("unimplemented")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dependencyCollection

import (
"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scope"
"github.com/MY-RV/gosc/internal/defaults/dependencyRecord"
)

// AddDependency implements definitions.DependencyCollectionBuilder.
func (d *dependencyCollectionBuilder) AddDependency(scope scope.Enum, factory definitions.Factory) {
dependencyRecord := dependencyRecord.Default(factory, scope)
registry := d.dependencyCollection.registry
registry[factory.GetFactoryType()] = dependencyRecord
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dependencyCollection

import (
"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scope"
)

// AddScoped implements definitions.DependencyCollectionBuilder.
func (d *dependencyCollectionBuilder) AddScoped(factory definitions.Factory) {
d.AddDependency(scope.SCOPED, factory)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dependencyCollection

import (
"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scope"
)

// AddSingleton implements definitions.DependencyCollectionBuilder.
func (d *dependencyCollectionBuilder) AddSingleton(factory definitions.Factory) {
d.AddDependency(scope.SCOPED, factory)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dependencyCollection

import (
"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scope"
)

// AddTransient implements definitions.DependencyCollectionBuilder.
func (d *dependencyCollectionBuilder) AddTransient(factory definitions.Factory) {
d.AddDependency(scope.SCOPED, factory)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package dependencyCollection

import (
"reflect"

"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scopeStatus"
"github.com/MY-RV/gosc/internal/helpers/map_helper"
)

// Build implements definitions.DependencyCollectionBuilder.
func (d *dependencyCollectionBuilder) Build() definitions.DependencyCollection {
return &dependencyCollection{
singletonServices: d.dependencyCollection.singletonServices,
scopedServices: make(map[reflect.Type]any),
registry: map_helper.CopyMap(d.dependencyCollection.registry),
scopeStatus: scopeStatus.ACTIVE,
}
}
19 changes: 19 additions & 0 deletions internal/defaults/dependencyCollection/pkg.NewBuilder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package dependencyCollection

import (
"reflect"

"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scopeStatus"
)

func NewBuilder() definitions.DependencyCollectionBuilder {
return &dependencyCollectionBuilder{
dependencyCollection: dependencyCollection{
singletonServices: make(map[reflect.Type]any),
scopedServices: make(map[reflect.Type]any),
registry: make(map[reflect.Type]definitions.DependencyRecord),
scopeStatus: scopeStatus.INACTIVE,
},
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dependencyCollection

import (
"reflect"

"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scopeStatus"
)

// Implements github.com/MY-RV/gosc/definitions::DependencyCollection
type dependencyCollection struct {
singletonServices map[reflect.Type]any
scopedServices map[reflect.Type]any

registry map[reflect.Type]definitions.DependencyRecord
scopeStatus scopeStatus.Enum
}

// TYPE CHECKING
func init() {
var _ definitions.DependencyCollection = &dependencyCollection{}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dependencyCollection

import (
"github.com/MY-RV/gosc/definitions"
)

// Implements github.com/MY-RV/gosc/definitions::DependencyCollectionBuilder
type dependencyCollectionBuilder struct {
dependencyCollection dependencyCollection
}

// TYPE CHECKING
func init() {
var _ definitions.DependencyCollectionBuilder = &dependencyCollectionBuilder{}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dependencyRecord

import "github.com/MY-RV/gosc/definitions"

// GetFactory implements definitions.DependencyRecord.
func (d *dependencyRecord) GetFactory() definitions.Factory {
return d.factory
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dependencyRecord

import "github.com/MY-RV/gosc/enums/scope"

// GetScope implements definitions.DependencyRecord.
func (d *dependencyRecord) GetScope() scope.Enum {
return d.scope
}
13 changes: 13 additions & 0 deletions internal/defaults/dependencyRecord/pkg.Default.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dependencyRecord

import (
"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scope"
)

func Default(factory definitions.Factory, scope scope.Enum) definitions.DependencyRecord {
return &dependencyRecord{
factory: factory,
scope: scope,
}
}
16 changes: 16 additions & 0 deletions internal/defaults/dependencyRecord/type.dependencyRecord.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dependencyRecord

import (
"github.com/MY-RV/gosc/definitions"
"github.com/MY-RV/gosc/enums/scope"
)

type dependencyRecord struct {
factory definitions.Factory
scope scope.Enum
}

// TYPE CHECKING
func init() {
var _ definitions.DependencyRecord = &dependencyRecord{}
}
8 changes: 8 additions & 0 deletions internal/defaults/factories/pkg.TypedFactory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package factories

import "github.com/MY-RV/gosc/definitions"

// Implements github.com/MY-RV/gosc/definitions.TypedFactory
type TypedFactory[T any] struct {
factoryFunction func(definitions.DependencyCollection) T
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package typedFactory

import "github.com/MY-RV/gosc/definitions"

// Implements github.com/MY-RV/gosc/definitions::TypedFactory.Create
func (typedFactory *DependencyTypedFactory[T]) Create(dependencyCollection definitions.DependencyCollection) any {
return typedFactory.factoryFunction(dependencyCollection)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package typedFactory

import "reflect"

// Implements github.com/MY-RV/gosc/definitions::TypedFactory.GetFactoryType
func (typedFactory *DependencyTypedFactory[T]) GetFactoryType() reflect.Type {
return typedFactory.factoryType
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package typedFactory

import "github.com/MY-RV/gosc/definitions"

// Implements github.com/MY-RV/gosc/definitions::TypedFactory.TypedCreate
func (typedFactory *DependencyTypedFactory[T]) TypedCreate(dependencyCollection definitions.DependencyCollection) T {
return typedFactory.factoryFunction(dependencyCollection)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package typedFactory

import (
"reflect"

"github.com/MY-RV/gosc/definitions"
)

func NewDependencyTypedFactory[T any](factoryFunction func(definitions.DependencyCollection) T) DependencyTypedFactory[T] {
reflectType := reflect.TypeOf(factoryFunction)
dependencyType := reflectType.Out(0)

return DependencyTypedFactory[T]{
factoryFunction: factoryFunction,
factoryType: dependencyType,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package typedFactory

import (
"reflect"

"github.com/MY-RV/gosc/definitions"
)

// Implements github.com/MY-RV/gosc/definitions::DependencyTypedFactory
type DependencyTypedFactory[T any] struct {
factoryFunction func(definitions.DependencyCollection) T
factoryType reflect.Type
}
9 changes: 9 additions & 0 deletions internal/helpers/map_helper/CopyMap.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package map_helper

func CopyMap[K comparable, V any](m map[K]V) map[K]V {
result := make(map[K]V, len(m))
for k, v := range m {
result[k] = v
}
return result
}
Loading