You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

var.go 1.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package exec
  2. import (
  3. "io"
  4. "gitlink.org.cn/cloudream/common/pkgs/types"
  5. "gitlink.org.cn/cloudream/common/utils/reflect2"
  6. "gitlink.org.cn/cloudream/common/utils/serder"
  7. )
  8. type VarID int
  9. type Var struct {
  10. ID VarID `json:"id"`
  11. Value VarValue `json:"value"`
  12. }
  13. type VarPack[T VarValue] struct {
  14. ID VarID `json:"id"`
  15. Value T `json:"value"`
  16. }
  17. func (v *VarPack[T]) ToAny() AnyVar {
  18. return AnyVar{
  19. ID: v.ID,
  20. Value: v.Value,
  21. }
  22. }
  23. // 变量的值
  24. type VarValue interface {
  25. Clone() VarValue
  26. }
  27. var valueUnion = serder.UseTypeUnionExternallyTagged(types.Ref(types.NewTypeUnion[VarValue](
  28. (*StreamValue)(nil),
  29. (*SignalValue)(nil),
  30. (*StringValue)(nil),
  31. )))
  32. func UseVarValue[T VarValue]() {
  33. valueUnion.Add(reflect2.TypeOf[T]())
  34. }
  35. type AnyVar = VarPack[VarValue]
  36. func V(id VarID, value VarValue) AnyVar {
  37. return AnyVar{
  38. ID: id,
  39. Value: value,
  40. }
  41. }
  42. type StreamValue struct {
  43. Stream io.ReadCloser `json:"-"`
  44. }
  45. // 不应该被调用
  46. func (v *StreamValue) Clone() VarValue {
  47. panic("StreamValue should not be cloned")
  48. }
  49. type SignalValue struct{}
  50. func (o *SignalValue) Clone() VarValue {
  51. return &SignalValue{}
  52. }
  53. type SignalVar = VarPack[*SignalValue]
  54. func NewSignal(id VarID) SignalVar {
  55. return SignalVar{
  56. ID: id,
  57. Value: &SignalValue{},
  58. }
  59. }
  60. type StringValue struct {
  61. Value string `json:"value"`
  62. }
  63. func (o *StringValue) Clone() VarValue {
  64. return &StringValue{Value: o.Value}
  65. }