package commands import ( "context" "strings" "git.loyso.art/frx/eway/internal/entity" "git.loyso.art/frx/eway/internal/matcher" "github.com/rs/zerolog" ) type dimensionDispatcher struct { heigth matcher.Unit width matcher.Unit length matcher.Unit } func (d dimensionDispatcher) isDimensionParam(value string) bool { return d.heigth.Match(value) || d.width.Match(value) || d.length.Match(value) } func (d dimensionDispatcher) dispatch(ctx context.Context, key, value string, in *entity.GoodsItemSize) (updated bool) { if !d.isDimensionParam(key) { return false } log := zerolog.Ctx(ctx).With().Str("key", key).Str("value", value).Logger() if strings.Contains(value, "/") { dimensionValues := strings.Split(value, "/") for _, dv := range dimensionValues { updated = updated || d.dispatch(ctx, key, dv, in) } } else { out, err := entity.ParseDimention(value, entity.DimensionLocalRU) if err != nil { log.Warn().Err(err).Msg("unable to parse key, skipping") return false } out = out.AdjustTo(entity.DimensionKindCentimeter) updated = true switch { case d.heigth.Match(key): in.Height = out case d.width.Match(key): in.Width = out case d.length.Match(key): in.Length = out default: log.Error().Str("key", key).Msg("unable to find proper matcher") updated = false } } return updated } func makeDefaultDimensionDispatcher() dimensionDispatcher { h := matcher.NewRadix(matcher.RadixCaseInsensitive()) h.Register("Высота") h.Register("Высота/*") w := matcher.NewRadix(matcher.RadixCaseInsensitive()) w.Register("Ширина") w.Register("Ширина/*") l := matcher.NewRadix(matcher.RadixCaseInsensitive()) l.Register("Длина") l.Register("Длина/*") l.Register("Общ. длина") return dimensionDispatcher{ heigth: h, width: w, length: l, } }