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  }