github.com/blend/go-sdk@v1.20240719.1/grpcutil/calculator/server.go (about) 1 /* 2 3 Copyright (c) 2024 - Present. Blend Labs, Inc. All rights reserved 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file. 5 6 */ 7 8 package calculator 9 10 import ( 11 "context" 12 "io" 13 14 v1 "github.com/blend/go-sdk/grpcutil/calculator/v1" 15 ) 16 17 // Server is the server for the calculator. 18 type Server struct { 19 v1.CalculatorServer 20 } 21 22 // Add adds a fixed set of numbers. 23 func (Server) Add(_ context.Context, values *v1.Numbers) (*v1.Number, error) { 24 var output float64 25 for _, value := range values.Values { 26 output += value 27 } 28 return &v1.Number{ 29 Value: output, 30 }, nil 31 } 32 33 // AddStream adds a stream of numbers. 34 func (Server) AddStream(stream v1.Calculator_AddStreamServer) error { 35 var output float64 36 var number *v1.Number 37 var err error 38 for { 39 select { 40 case <-stream.Context().Done(): 41 return stream.SendAndClose(&v1.Number{ 42 Value: output, 43 }) 44 default: 45 } 46 47 number, err = stream.Recv() 48 if err == io.EOF { 49 return stream.SendAndClose(&v1.Number{ 50 Value: output, 51 }) 52 } 53 54 output += number.Value 55 } 56 } 57 58 // Subtract subtracts a fixed set of numbers. 59 func (Server) Subtract(_ context.Context, values *v1.Numbers) (*v1.Number, error) { 60 if len(values.Values) == 0 { 61 return nil, nil 62 } 63 output := values.Values[0] 64 for _, value := range values.Values[1:] { 65 output -= value 66 } 67 return &v1.Number{ 68 Value: output, 69 }, nil 70 } 71 72 // SubtractStream subtracts a stream of numbers. 73 func (Server) SubtractStream(stream v1.Calculator_SubtractStreamServer) error { 74 var outputSet bool 75 var output float64 76 var number *v1.Number 77 var err error 78 for { 79 select { 80 case <-stream.Context().Done(): 81 return stream.SendAndClose(&v1.Number{ 82 Value: output, 83 }) 84 default: 85 } 86 87 number, err = stream.Recv() 88 if err == io.EOF { 89 return stream.SendAndClose(&v1.Number{ 90 Value: output, 91 }) 92 } 93 if !outputSet { 94 output = number.Value 95 outputSet = true 96 } else { 97 output -= number.Value 98 } 99 } 100 } 101 102 // Multiply multiplies a fixed set of numbers. 103 func (Server) Multiply(_ context.Context, values *v1.Numbers) (*v1.Number, error) { 104 if len(values.Values) == 0 { 105 return nil, nil 106 } 107 output := values.Values[0] 108 for _, value := range values.Values[1:] { 109 output *= value 110 } 111 return &v1.Number{ 112 Value: output, 113 }, nil 114 } 115 116 // MultiplyStream multiplies a stream of numbers. 117 func (Server) MultiplyStream(stream v1.Calculator_MultiplyStreamServer) error { 118 var output float64 119 var outputSet bool 120 var number *v1.Number 121 var err error 122 for { 123 select { 124 case <-stream.Context().Done(): 125 return stream.SendAndClose(&v1.Number{ 126 Value: output, 127 }) 128 default: 129 } 130 131 number, err = stream.Recv() 132 if err == io.EOF { 133 return stream.SendAndClose(&v1.Number{ 134 Value: output, 135 }) 136 } 137 138 if !outputSet { 139 output = number.Value 140 outputSet = true 141 } else { 142 output *= number.Value 143 } 144 } 145 } 146 147 // Divide divides a fixed set of numbers. 148 func (Server) Divide(_ context.Context, values *v1.Numbers) (*v1.Number, error) { 149 if len(values.Values) == 0 { 150 return nil, nil 151 } 152 output := values.Values[0] 153 for _, value := range values.Values[1:] { 154 output /= value 155 } 156 return &v1.Number{ 157 Value: output, 158 }, nil 159 } 160 161 // DivideStream divides a stream of numbers. 162 func (Server) DivideStream(stream v1.Calculator_DivideStreamServer) error { 163 var outputSet bool 164 var output float64 165 var number *v1.Number 166 var err error 167 for { 168 select { 169 case <-stream.Context().Done(): 170 return stream.SendAndClose(&v1.Number{ 171 Value: output, 172 }) 173 default: 174 } 175 176 number, err = stream.Recv() 177 if err == io.EOF { 178 return stream.SendAndClose(&v1.Number{ 179 Value: output, 180 }) 181 } 182 if !outputSet { 183 output = number.Value 184 outputSet = true 185 } else { 186 output /= number.Value 187 } 188 } 189 }