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 }