// 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_ }