| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // package use_case -- вариант использования
- package 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/goarch/lev1/size"
- "gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
- "gitp78su.ipnodns.ru/svi/kern/v3"
- )
- // UseCase -- вариант использования
- type UseCase struct {
- ElemBase_ *elem_base.ElemBase `yaml:"elem_base"`
- Size_ *size.Size `yaml:"size"`
- Links_ []alias.Id `yaml:"links"` // Список ссылок
- }
- var (
- hassert = kern.GetFnHassert()
- )
- // NewUseCase -- возвращает новый вариант использования
- func NewUseCase(elemBase *elem_base.ElemBase, size_ *size.Size) (*UseCase, error) {
- hassert(elemBase != nil, "NewUseCase(): elemBase==nil")
- 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)
- var links []alias.Id
- 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{
- ElemBase_: elemBase,
- Size_: size_,
- Links_: links,
- }
- return sf, nil
- }
- // Check -- проверяет корректность элемента
- func (sf *UseCase) Check(mapElem map[alias.Id]types.IElemDrawer) string {
- var msgErr string
- // Нет ссылок
- if len(sf.Links_) == 0 {
- return fmt.Sprintf("id=%q, нет собственных ссылок", sf.ElemBase_.Id_)
- }
- // Проверить, что ссылки реально существует
- for _, id := range sf.Links_ {
- link, ok := mapElem[id]
- if !ok {
- msgErr += fmt.Sprintf("id=%q, собственная ссылка не существует\n", id)
- continue
- }
- if link.Type() != cons.TypeUseLink {
- msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
- continue
- }
- ln, isOk := link.(types.ILinker)
- if !isOk {
- msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
- continue
- }
- // Проверить что ссылка взаимная
- if !(ln.SrcId() == sf.ElemBase_.Id_ || ln.DstId() == sf.ElemBase_.Id_) {
- msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n", id, ln.SrcId(), ln.DstId())
- }
- }
- return msgErr
- }
- // Links -- ссылки вариантов использования
- func (sf *UseCase) Links() []alias.Id {
- return sf.Links_
- }
|