Skip to content
Snippets Groups Projects
Select Git revision
  • 734f5ea697ebffd3bf13fa74f8041e85b1a47eaf
  • master default protected
2 results

parser.go

Blame
  • parser.go 4.86 KiB
    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"io/ioutil"
    	"os"
    	"strconv"
    	"strings"
    
    	"gopkg.in/yaml.v2"
    )
    
    type Transaction struct {
    	ID       int    `json:"ID"`
    	Sender   string `json:"sender"`
    	Receiver string `json:"receiver"`
    	Amount   int    `json:"amount"`
    	IsFake   bool   `json:"isFake"`
    }
    
    type Node struct {
    	ID         int          `yaml:"id"`
    	Address    string       `yaml:"address"`
    	Neighbours []Neighbours `yaml:"neighbours"`
    }
    
    type Neighbours struct {
    	ID      int    `yaml:"id"`
    	Address string `yaml:"address"`
    }
    
    func ListOfTransactions() {
    	// Open our jsonFile
    	jsonFile, err := os.Open("node1.json")
    	// if we os.Open returns an error then handle it
    	if err != nil {
    		fmt.Println(err)
    	}
    	fmt.Println("Successfully Opened node1.json")
    	// read our opened jsonFile as a byte array.
    	byteValue, _ := ioutil.ReadAll(jsonFile)
    
    	var transactions []Transaction
    	// we unmarshal our byteArray which contains our
    	// jsonFile's content into 'transaction' which we defined above
    	json.Unmarshal(byteValue, &transactions)
    
    	for i := 0; i < len(transactions); i++ {
    		fmt.Println("ID:" + strconv.Itoa(transactions[i].ID))
    		fmt.Println("Sender: " + transactions[i].Sender)
    		fmt.Println("Receiver: " + transactions[i].Receiver)
    		fmt.Println("Amount: " + strconv.Itoa(transactions[i].Amount))
    		fmt.Println("isFake: " + strconv.FormatBool(transactions[i].IsFake))
    	}
    	// defer the closing of our jsonFile so that we can parse it later on
    	defer jsonFile.Close()
    }
    
    func AppendData(newTrans Transaction, filename string) {
    	jsonFile, err := os.Open(filename)
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	file, _ := ioutil.ReadAll(jsonFile)
    	data := []Transaction{}
    	json.Unmarshal(file, &data)
    
    	data = append(data, newTrans)
    	dataBytes, _ := json.MarshalIndent(data, "", " ")
    
    	_ = ioutil.WriteFile(filename, dataBytes, 0666)
    }
    
    func Fake(fakeID int, fakeTrans Transaction) {
    	jsonFile, err := os.Open("node1.json")
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	byteValue, _ := ioutil.ReadAll(jsonFile)
    
    	var transactions []Transaction
    	json.Unmarshal(byteValue, &transactions)
    	for i := 0; i < len(transactions); i++ {
    		print(transactions[i].ID)
    		if transactions[i].ID == fakeID {
    			transactions[i] = fakeTrans
    		}
    	}
    	dataBytes, _ := json.MarshalIndent(transactions, "", " ")
    
    	_ = ioutil.WriteFile("node1.json", dataBytes, 0666)
    }
    
    func ReadYAML(filename string) Node {
    	file, err := ioutil.ReadFile(filename)
    	if err != nil {
    		panic(err)
    	}
    	var yamlData Node
    	err = yaml.Unmarshal(file, &yamlData)
    
    	if err != nil {
    		panic(err)
    	}
    
    	return yamlData
    }
    
    func TrimLeftChar(s string) string {
    	for i := range s {
    		if i > 0 {
    			return s[i:]
    		}
    	}
    	return s[:0]
    }
    
    func TradeFromString(message string, filename string) {
    	tablMessage := strings.Split(message, " ")
    	if tablMessage[4][len(tablMessage[4])-1] == '\n' {
    		tablMessage[4] = tablMessage[4][:len(tablMessage[4])-1]
    	}
    	id, _ := strconv.ParseInt(tablMessage[0], 10, 32)
    	amount, _ := strconv.ParseInt(tablMessage[3], 10, 32)
    	isFake, _ := strconv.ParseBool(tablMessage[4])
    	newTrans := &Transaction{
    		ID:       int(id),
    		Sender:   tablMessage[1],
    		Receiver: tablMessage[2],
    		Amount:   int(amount),
    		IsFake:   isFake,
    	}
    	print(isFake)
    	AppendData(*newTrans, filename)
    }
    
    func removePortInString(address string) string {
    	for i := 0; i < len(address); i++ {
    		if address[i] == ':' {
    			address = address[:i]
    			break
    		}
    	}
    	return address
    }
    
    func checkTrade(message string, filename string) int {
    	tablMessage := strings.Split(message, " ")
    	if tablMessage[4][len(tablMessage[4])-1] == '\n' {
    		tablMessage[4] = tablMessage[4][:len(tablMessage[4])-1]
    	}
    	id, _ := strconv.ParseInt(tablMessage[0], 10, 32)
    	amount, _ := strconv.ParseInt(tablMessage[3], 10, 32)
    	isFake, err := strconv.ParseBool(tablMessage[4])
    	if err != nil {
    		fmt.Println(err)
    	}
    	newTrans := &Transaction{
    		ID:       int(id),
    		Sender:   tablMessage[1],
    		Receiver: tablMessage[2],
    		Amount:   int(amount),
    		IsFake:   isFake,
    	}
    	jsonFile, err := os.Open(filename)
    	if err != nil {
    		fmt.Println(err)
    	}
    	byteValue, _ := ioutil.ReadAll(jsonFile)
    	var transactions []Transaction
    	json.Unmarshal(byteValue, &transactions)
    	for i := 0; i < len(transactions); i++ {
    		if transAreEqual(transactions[i], *newTrans) {
    			return 1
    		}
    	}
    	return 0
    }
    
    func getNbrOfTrade(message string) int {
    	if message[len(message)-1] == '\n' {
    		message = message[:len(message)-1]
    	}
    	tablMessage := strings.Split(message, " ")
    	if len(tablMessage) == 6 {
    		nbrTrade, err := strconv.ParseInt(tablMessage[5], 10, 32)
    		if err != nil {
    			fmt.Println(err)
    		}
    		return int(nbrTrade)
    	}
    	return 0
    }
    
    func transAreEqual(trans1 Transaction, trans2 Transaction) bool {
    	if trans1.ID != trans2.ID {
    		return false
    	}
    	if trans1.Sender != trans2.Sender {
    		return false
    	}
    	if trans1.Receiver != trans2.Receiver {
    		return false
    	}
    	if trans1.Amount != trans2.Amount {
    		return false
    	}
    	if trans1.IsFake != trans2.IsFake {
    		return false
    	}
    	return true
    }