using System;
namespace GodotHostTest.GodotDI;
///
/// An object that allows communication through scopes, by providing a couple getter/setter that can be injected in
/// different scopes.
///
/// The type that's been passed through scopes.
///
public class ValueProvider
{
private bool _isSet;
private T? _value;
public ValueProvider()
{
Setter = new SetterImplementation(this);
}
public IValueSetter Setter { get; }
public IValueGetter Getter => !_isSet
? throw new InvalidOperationException($"Value of type {typeof(T)} has not been set yet.")
: new GetterImplementation(_value!);
private class SetterImplementation(ValueProvider valueProvider) : IValueSetter
{
public void Set(T value)
{
if (valueProvider._isSet)
throw new InvalidOperationException($"A value (of type {typeof(T)}) cannot be set more than once.");
valueProvider._value = value;
valueProvider._isSet = true;
}
}
private class GetterImplementation(T value) : IValueGetter
{
public T Get()
{
return value;
}
}
}