view pkg/models/isrs.go @ 5601:1222b777f51f

Made golint finally happy.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 06 Aug 2022 02:09:57 +0200
parents 15c9d4064f0f
children
line wrap: on
line source

// This is Free Software under GNU Affero General Public License v >= 3.0
// without warranty, see README.md and license for details.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
// License-Filename: LICENSES/AGPL-3.0.txt
//
// Copyright (C) 2018 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Raimund Renkert <raimund.renkert@intevation.de>
//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>

package models

import (
	"encoding/json"
	"errors"
	"fmt"
	"strconv"
)

// Isrs represents the gauge identification data structure
type Isrs struct {
	CountryCode    string
	LoCode         string
	FairwaySection string
	Orc            string
	Hectometre     int
}

// UnmarshalJSON implements the json.Unmarshaler interface.
func (isrs *Isrs) UnmarshalJSON(data []byte) error {
	var s string
	if err := json.Unmarshal(data, &s); err != nil {
		return err
	}
	in, err := IsrsFromString(s)
	if err != nil {
		return err
	}
	*isrs = *in
	return nil
}

// Less orders two Isrs codes.
func (isrs *Isrs) Less(other *Isrs) bool {
	if isrs.CountryCode < other.CountryCode {
		return true
	}
	if isrs.CountryCode > other.CountryCode {
		return false
	}
	if isrs.LoCode < other.LoCode {
		return true
	}
	if isrs.LoCode > other.LoCode {
		return false
	}
	if isrs.FairwaySection < other.FairwaySection {
		return true
	}
	if isrs.FairwaySection > other.FairwaySection {
		return false
	}
	if isrs.Orc < other.Orc {
		return true
	}
	if isrs.Orc > other.Orc {
		return false
	}
	if isrs.Hectometre < other.Hectometre {
		return true
	}
	return false
}

// MarshalJSON implements the json.Marshaler interface.
func (isrs *Isrs) MarshalJSON() ([]byte, error) {
	if isrs == nil {
		return nil, nil
	}
	return json.Marshal(isrs.String())
}

// IsrsFromString converts string representation of isrs code to type Isrs
func IsrsFromString(isrsCode string) (*Isrs, error) {
	if len(isrsCode) < 20 {
		return nil, errors.New("ISRS code too short")
	}
	hm, err := strconv.Atoi(isrsCode[15:20])
	if err != nil {
		return nil, err
	}
	isrs := Isrs{
		CountryCode:    isrsCode[0:2],
		LoCode:         isrsCode[2:5],
		FairwaySection: isrsCode[5:10],
		Orc:            isrsCode[10:15],
		Hectometre:     hm,
	}
	return &isrs, nil
}

// String creates a isrs code string from Isrs
func (isrs *Isrs) String() string {
	return fmt.Sprintf("%s%s%s%s%05d",
		isrs.CountryCode,
		isrs.LoCode,
		isrs.FairwaySection,
		isrs.Orc,
		isrs.Hectometre)
}