diff --git a/yahoo_market.go b/yahoo_market.go index ecc7d70..b15060e 100644 --- a/yahoo_market.go +++ b/yahoo_market.go @@ -1,47 +1,46 @@ // Copyright (c) 2013 by Michael Dvorkin. All Rights Reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. -//----------------------------------------------------------------------------- +// Use of this source code is governed by a MIT-style license that can +// be found in the LICENSE file. package mop import ( - `fmt` `bytes` + `fmt` `io/ioutil` `net/http` `regexp` `strings` ) -const market_url = `http://finance.yahoo.com/marketupdate/overview` +const marketURL = `http://finance.yahoo.com/marketupdate/overview` type Market struct { - IsClosed bool - Dow map[string]string - Nasdaq map[string]string - Sp500 map[string]string - Advances map[string]string - Declines map[string]string - Unchanged map[string]string - Highs map[string]string - Lows map[string]string - regex *regexp.Regexp - errors string + IsClosed bool // True when U.S. markets are closed. + Dow map[string]string // Hash of Dow Jones indicators. + Nasdaq map[string]string // Hash of NASDAQ indicators. + Sp500 map[string]string // Hash of S&P 500 indicators. + Advances map[string]string // + Declines map[string]string // + Unchanged map[string]string // + Highs map[string]string // + Lows map[string]string // + regex *regexp.Regexp // + errors string // } //----------------------------------------------------------------------------- -func (self *Market) Initialize() *Market { - self.IsClosed = false - self.Dow = make(map[string]string) - self.Nasdaq = make(map[string]string) - self.Sp500 = make(map[string]string) - self.Advances = make(map[string]string) - self.Declines = make(map[string]string) - self.Unchanged = make(map[string]string) - self.Highs = make(map[string]string) - self.Lows = make(map[string]string) - self.errors = `` +func (market *Market) Initialize() *Market { + market.IsClosed = false + market.Dow = make(map[string]string) + market.Nasdaq = make(map[string]string) + market.Sp500 = make(map[string]string) + market.Advances = make(map[string]string) + market.Declines = make(map[string]string) + market.Unchanged = make(map[string]string) + market.Highs = make(map[string]string) + market.Lows = make(map[string]string) + market.errors = `` const any = `\s*<.+?>` const some = `<.+?` @@ -61,21 +60,21 @@ func (self *Market) Initialize() *Market { `(New Lo's)`, any, price, any, price, any, } - self.regex = regexp.MustCompile(strings.Join(rules, ``)) + market.regex = regexp.MustCompile(strings.Join(rules, ``)) - return self + return market } //----------------------------------------------------------------------------- -func (self *Market) Fetch() (this *Market) { - this = self // <-- This ensures we return correct self after recover() from panic() attack. +func (market *Market) Fetch() (this *Market) { + this = market // <-- This ensures we return correct market after recover() from panic() attack. defer func() { if err := recover(); err != nil { - self.errors = fmt.Sprintf("Error fetching market data...\n%s", err) + market.errors = fmt.Sprintf("Error fetching market data...\n%s", err) } }() - response, err := http.Get(market_url) + response, err := http.Get(marketURL) if err != nil { panic(err) } @@ -86,28 +85,28 @@ func (self *Market) Fetch() (this *Market) { panic(err) } - body = self.check_if_market_open(body) - return self.extract(self.trim(body)) + body = market.checkIfMarketIsOpen(body) + return market.extract(market.trim(body)) } //----------------------------------------------------------------------------- -func (self *Market) Ok() (bool, string) { - return self.errors == ``, self.errors +func (market *Market) Ok() (bool, string) { + return market.errors == ``, market.errors } // private //----------------------------------------------------------------------------- -func (self *Market) check_if_market_open(body []byte) []byte { +func (market *Market) checkIfMarketIsOpen(body []byte) []byte { start := bytes.Index(body, []byte(`id="yfs_market_time"`)) finish := start + bytes.Index(body[start:], []byte(``)) snippet := body[start:finish] - self.IsClosed = bytes.Contains(snippet, []byte(`closed`)) || bytes.Contains(snippet, []byte(`open in`)) + market.IsClosed = bytes.Contains(snippet, []byte(`closed`)) || bytes.Contains(snippet, []byte(`open in`)) return body[finish:] } //----------------------------------------------------------------------------- -func (self *Market) trim(body []byte) []byte { +func (market *Market) trim(body []byte) []byte { start := bytes.Index(body, []byte(`