github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/network/util/util.go (about)

     1  package util
     2  
     3  import (
     4  	pb "github.com/tickoalcantara12/micro/v3/proto/network"
     5  	rtrPb "github.com/tickoalcantara12/micro/v3/proto/router"
     6  	"github.com/tickoalcantara12/micro/v3/service/network"
     7  	"github.com/tickoalcantara12/micro/v3/service/router"
     8  )
     9  
    10  // PeersToProto returns node peers graph encoded into protobuf
    11  func PeersToProto(node network.Node, depth uint) *pb.Peer {
    12  	// network node aka root node
    13  	pbNode := &pb.Node{
    14  		Id:      node.Id(),
    15  		Address: node.Address(),
    16  		Status: &pb.Status{
    17  			Error: &pb.Error{
    18  				Count: uint32(node.Status().Error().Count()),
    19  				Msg:   node.Status().Error().Msg(),
    20  			},
    21  		},
    22  	}
    23  
    24  	// set the network name if network is not nil
    25  	if node.Network() != nil {
    26  		pbNode.Network = node.Network().Name()
    27  	}
    28  
    29  	// we will build proto topology into this
    30  	pbPeers := &pb.Peer{
    31  		Node:  pbNode,
    32  		Peers: make([]*pb.Peer, 0),
    33  	}
    34  
    35  	for _, peer := range node.Peers() {
    36  		pbPeer := peerProtoTopology(peer, depth)
    37  		pbPeers.Peers = append(pbPeers.Peers, pbPeer)
    38  	}
    39  
    40  	return pbPeers
    41  }
    42  
    43  func peerProtoTopology(peer network.Node, depth uint) *pb.Peer {
    44  	node := &pb.Node{
    45  		Id:      peer.Id(),
    46  		Address: peer.Address(),
    47  		Status: &pb.Status{
    48  			Error: &pb.Error{
    49  				Count: uint32(peer.Status().Error().Count()),
    50  				Msg:   peer.Status().Error().Msg(),
    51  			},
    52  		},
    53  	}
    54  
    55  	// set the network name if network is not nil
    56  	if peer.Network() != nil {
    57  		node.Network = peer.Network().Name()
    58  	}
    59  
    60  	pbPeers := &pb.Peer{
    61  		Node:  node,
    62  		Peers: make([]*pb.Peer, 0),
    63  	}
    64  
    65  	// return if we reached the end of topology or depth
    66  	if depth == 0 || len(peer.Peers()) == 0 {
    67  		return pbPeers
    68  	}
    69  
    70  	// decrement the depth
    71  	depth--
    72  
    73  	// iterate through peers of peers aka pops
    74  	for _, pop := range peer.Peers() {
    75  		peer := peerProtoTopology(pop, depth)
    76  		pbPeers.Peers = append(pbPeers.Peers, peer)
    77  	}
    78  
    79  	return pbPeers
    80  }
    81  
    82  // RouteToProto encodes route into protobuf and returns it
    83  func RouteToProto(route router.Route) *rtrPb.Route {
    84  	return &rtrPb.Route{
    85  		Service: route.Service,
    86  		Address: route.Address,
    87  		Gateway: route.Gateway,
    88  		Network: route.Network,
    89  		Router:  route.Router,
    90  		Link:    route.Link,
    91  		Metric:  int64(route.Metric),
    92  	}
    93  }
    94  
    95  // ProtoToRoute decodes protobuf route into router route and returns it
    96  func ProtoToRoute(route *rtrPb.Route) router.Route {
    97  	return router.Route{
    98  		Service: route.Service,
    99  		Address: route.Address,
   100  		Gateway: route.Gateway,
   101  		Network: route.Network,
   102  		Router:  route.Router,
   103  		Link:    route.Link,
   104  		Metric:  route.Metric,
   105  	}
   106  }