| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- // package elem_use_case -- вариант использования
- package elem_use_case
- import (
- "fmt"
- "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
- "gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
- "gitp78su.ipnodns.ru/svi/goarch/lev0/types"
- "gitp78su.ipnodns.ru/svi/kern/v3"
- )
- // UseCase -- вариант использования
- type UseCase struct {
- types.IElemBase
- Size_ types.ISize `yaml:"size"`
- Links_ map[alias.Id]types.IElemGroupLink `yaml:"links"` // Список ссылок
- }
- var (
- hassert = kern.GetFnHassert()
- )
- // NewUseCase -- возвращает новый вариант использования
- func NewUseCase(elemBase types.IElemBase, size types.ISize,
- links map[alias.Id]types.IElemGroupLink) *UseCase {
- // id := elemBase.Id()
- // _links0, isOk := elemBase.Elem_["links"]
- // hassert(isOk, "NewUseCase(): id=%q, links not found", id)
- // _links, isOk := _links0.([]interface{})
- // hassert(isOk, "NewUseCase(): id=%q, `links`(%+v) not []interface{}", id, _links0)
- // for _, _id := range _links {
- // id0, isOk := _id.(string)
- // hassert(isOk, "NewUseCase(): id=%q, `link`(%T, %+v) not string", id, _id, _id)
- // id1 := alias.Id(id0)
- // hassert(id1 != "", "NewUseCase(): id=%q, `link` is empty", id)
- // links = append(links, id1)
- // }
- sf := &UseCase{
- IElemBase: elemBase,
- Size_: size,
- Links_: links,
- }
- sf.SelfCheck()
- return sf
- }
- // SelfCheck -- самопроверка
- func (sf *UseCase) SelfCheck() {
- sf.IElemBase.SelfCheck()
- hassert(sf.Size_ != nil, "UseCase.SelfCheck(): Size_ == nil")
- var msgErr string
- // Нет ссылок
- if len(sf.Links_) == 0 {
- return
- }
- // Проверить, что ссылки реально существует
- for id, link := range sf.Links_ {
- if link.Type() != cons.TypeUseLink {
- msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
- continue
- }
- ln, isOk := link.(types.IElemLinker)
- if !isOk {
- msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
- continue
- }
- // Проверить что ссылка взаимная
- if !(ln.SrcId() == sf.Id() || ln.DstId() == sf.Id()) {
- msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n", id, ln.SrcId(), ln.DstId())
- }
- }
- }
- // Links -- ссылки вариантов использования
- func (sf *UseCase) Links() map[alias.Id]types.IElemGroupLink {
- return sf.Links_
- }
|