package data_parser import ( "context" "fmt" "net/http" "regexp" "github.com/gocarina/gocsv" ) type parser struct{} func NewGoogleTableScheduleParser() IDataParser { return &parser{} } func (p *parser) Parse(_ context.Context, url string, v interface{}) error { re := regexp.MustCompile(`/d/([a-zA-Z0-9-_]+)`) matches := re.FindStringSubmatch(url) if len(matches) < 2 { return fmt.Errorf("Не удалось найти ID таблицы в ссылке") } sheetID := matches[1] csvURL := fmt.Sprintf("https://docs.google.com/spreadsheets/d/%s/export?format=csv", sheetID) resp, err := http.Get(csvURL) if err != nil { return fmt.Errorf("Ошибка при скачивании таблицы: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Ошибка: статус код %d (убедитесь, что таблица публичная)", resp.StatusCode) } if err := gocsv.Unmarshal(resp.Body, v); err != nil { return fmt.Errorf("Ошибка при парсинге CSV в структуру: %v", err) } return nil }