2023-12-26 22:18:09 +00:00
|
|
|
// Package deadlinks implements a liveness checker for hyperlinks in HTML and
|
|
|
|
// gemtext documents.
|
2023-12-28 14:40:07 +00:00
|
|
|
//
|
|
|
|
// # Storage
|
|
|
|
//
|
|
|
|
// By default DeadLinks uses an in-memory SQLite database for tracking the
|
|
|
|
// status of resources and the links between them. If memory usage becomes a
|
|
|
|
// problem it is also possible to use a SQLite database file:
|
|
|
|
//
|
|
|
|
// store := deadlinks.NewSQLiteStore(&deadlinks.SQLiteStoreOpts{
|
|
|
|
// Path: "/path/to/db/file.sqlite",
|
|
|
|
// })
|
|
|
|
//
|
|
|
|
// // TODO initialize DeadLinks
|
2023-12-26 22:18:09 +00:00
|
|
|
package deadlinks
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"net/url"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// URL is a standard universal resource identifier, normalized particularly for
|
|
|
|
// this package.
|
|
|
|
type URL string
|
|
|
|
|
|
|
|
// ParseURL parses and returns a URL based on the given string, or an error.
|
|
|
|
func ParseURL(urlStr string) (URL, error) {
|
|
|
|
u, err := url.Parse(urlStr)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return URL(u.String()), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseURLs(urlStrs []string) ([]URL, error) {
|
|
|
|
var (
|
|
|
|
res = make([]URL, 0, len(urlStrs))
|
|
|
|
errs []error
|
|
|
|
)
|
|
|
|
for _, urlStr := range urlStrs {
|
|
|
|
u, err := ParseURL(urlStr)
|
|
|
|
if err == nil {
|
|
|
|
res = append(res, u)
|
|
|
|
} else {
|
|
|
|
errs = append(errs, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res, errors.Join(errs...)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ResourceStatus describes what state a particular Resource is in.
|
|
|
|
type ResourceStatus int
|
|
|
|
|
|
|
|
// Enumeration of ResourceStatus values.
|
|
|
|
const (
|
|
|
|
ResourceStatusUnknown ResourceStatus = iota
|
|
|
|
ResourceStatusOK
|
|
|
|
ResourceStatusError
|
|
|
|
)
|
|
|
|
|
|
|
|
func (ds ResourceStatus) String() string {
|
|
|
|
switch ds {
|
|
|
|
case ResourceStatusUnknown:
|
|
|
|
return "UNKNOWN"
|
|
|
|
case ResourceStatusOK:
|
|
|
|
return "OK"
|
|
|
|
case ResourceStatusError:
|
|
|
|
return "ERROR"
|
|
|
|
default:
|
|
|
|
panic(fmt.Sprintf("unknown ResourceStatus: %#v", ds))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Resource describes the current state of a resource, with the resource being
|
|
|
|
// uniquely identified by a URL.
|
|
|
|
type Resource struct {
|
|
|
|
URL URL
|
|
|
|
Status ResourceStatus
|
|
|
|
Pinned bool
|
|
|
|
LastChecked time.Time
|
|
|
|
|
|
|
|
// only set if Status == ResourceStatusError
|
|
|
|
ErrorString string
|
|
|
|
|
|
|
|
// Indicate the URLs of resources which link to/are linked from this
|
|
|
|
// resource.
|
|
|
|
IncomingLinkURLs, OutgoingLinkURLs []URL
|
|
|
|
}
|