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.5 kB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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[T VarValue] struct {
  10. ID VarID `json:"id"`
  11. Value T `json:"value"`
  12. }
  13. // 变量的值
  14. type VarValue interface {
  15. Clone() VarValue
  16. }
  17. var valueUnion = serder.UseTypeUnionExternallyTagged(types.Ref(types.NewTypeUnion[VarValue](
  18. (*StreamValue)(nil),
  19. (*SignalValue)(nil),
  20. (*StringValue)(nil),
  21. )))
  22. func UseVarValue[T VarValue]() {
  23. valueUnion.Add(reflect2.TypeOf[T]())
  24. }
  25. type StreamValue struct {
  26. Stream io.ReadCloser `json:"-"`
  27. }
  28. // 不应该被调用
  29. func (v *StreamValue) Clone() VarValue {
  30. panic("StreamValue should not be cloned")
  31. }
  32. type StreamVar = Var[*StreamValue]
  33. func NewStreamVar(id VarID, stream io.ReadCloser) StreamVar {
  34. return StreamVar{
  35. ID: id,
  36. Value: &StreamValue{Stream: stream},
  37. }
  38. }
  39. type SignalValue struct{}
  40. func (o *SignalValue) Clone() VarValue {
  41. return &SignalValue{}
  42. }
  43. type SignalVar = Var[*SignalValue]
  44. func NewSignalVar(id VarID) SignalVar {
  45. return SignalVar{
  46. ID: id,
  47. Value: &SignalValue{},
  48. }
  49. }
  50. type StringValue struct {
  51. Value string `json:"value"`
  52. }
  53. func (o *StringValue) Clone() VarValue {
  54. return &StringValue{Value: o.Value}
  55. }
  56. type StringVar = Var[*StringValue]
  57. func NewStringVar(id VarID, value string) StringVar {
  58. return StringVar{
  59. ID: id,
  60. Value: &StringValue{Value: value},
  61. }
  62. }