mirror of
https://github.com/maride/mexico.git
synced 2024-11-13 23:04:25 +00:00
72 lines
2.3 KiB
Go
72 lines
2.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"github.com/maride/mexico/mexigo/interpreter"
|
||
|
"log"
|
||
|
"math"
|
||
|
"net"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// The fake base domain which classifies a domain name as a mexico command, rather than a "normal" domain name
|
||
|
MexicoFakeDomain = "mexico.invalid."
|
||
|
)
|
||
|
|
||
|
// This is a wrapper function for net.LookupMX(), filtering for mexico records, and sorting the remaining by linenum
|
||
|
func LookupMX(basedomain string) []interpreter.Codeline {
|
||
|
// Do the basic lookup
|
||
|
rawMX, lookupErr := net.LookupMX(basedomain)
|
||
|
if lookupErr != nil {
|
||
|
// Encountered error while looking up basedomain - log and return
|
||
|
log.Printf("Failed to resolve '%s': %s", basedomain, lookupErr.Error())
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Filter results for the (fake) domain "mexico.invalid."
|
||
|
var filteredMX []*net.MX
|
||
|
|
||
|
// Iterate over all returned MX records
|
||
|
for _, raw := range rawMX {
|
||
|
// Check if it's a mexico MX record
|
||
|
if strings.HasSuffix(raw.Host, MexicoFakeDomain) {
|
||
|
// it is, add to filtered array
|
||
|
filteredMX = append(filteredMX, raw)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Sort filtered results, based on the priority - or line number, in the words of this esolang :)
|
||
|
var records []interpreter.Codeline
|
||
|
var smallestPriority uint16 = math.MaxInt16
|
||
|
smallestPriorityIndex := 0
|
||
|
|
||
|
// Iterate over filteredMX and delete the record with the smallest priority until we don't have any more filteredMX
|
||
|
for len(filteredMX) > 0 {
|
||
|
// Iterate over the filteredMX to find the one with the smallest priority
|
||
|
for i, f := range filteredMX {
|
||
|
if f.Pref < smallestPriority {
|
||
|
// Found entry with smaller index than the current one
|
||
|
smallestPriority = f.Pref
|
||
|
smallestPriorityIndex = i
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Remove mexico fake domain suffix
|
||
|
command := strings.TrimSuffix(filteredMX[smallestPriorityIndex].Host, "." + MexicoFakeDomain)
|
||
|
|
||
|
// Replace '-' with space.
|
||
|
// This reserves the process done by the compiler to transform this command + arg into a FQDN
|
||
|
command = strings.Replace(command, "-", " ", 1)
|
||
|
|
||
|
// Add hostname of "smallest" record to the records array, and delete it from filteredMX
|
||
|
records = append(records, interpreter.Codeline{
|
||
|
Linenumber: int(filteredMX[smallestPriorityIndex].Pref),
|
||
|
Code: command,
|
||
|
})
|
||
|
filteredMX = append(filteredMX[:smallestPriorityIndex], filteredMX[smallestPriorityIndex + 1:]...)
|
||
|
}
|
||
|
|
||
|
// Return filtered and sorted records
|
||
|
return records
|
||
|
}
|