weather

package
v0.18.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 2, 2025 License: MIT Imports: 19 Imported by: 0

Documentation

Overview

Package weather is a reverse proxy.

It translates gRPC into RESTful JSON APIs.

Index

Constants

View Source
const (
	AmbientLocalWeatherService_GetWeather_FullMethodName          = "/ambient.weather.AmbientLocalWeatherService/GetWeather"
	AmbientLocalWeatherService_CountWeatherUpdates_FullMethodName = "/ambient.weather.AmbientLocalWeatherService/CountWeatherUpdates"
)

Variables

View Source
var AmbientLocalWeatherService_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "ambient.weather.AmbientLocalWeatherService",
	HandlerType: (*AmbientLocalWeatherServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetWeather",
			Handler:    _AmbientLocalWeatherService_GetWeather_Handler,
		},
		{
			MethodName: "CountWeatherUpdates",
			Handler:    _AmbientLocalWeatherService_CountWeatherUpdates_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "weather/weather_service.proto",
}

AmbientLocalWeatherService_ServiceDesc is the grpc.ServiceDesc for AmbientLocalWeatherService service. It's only intended for direct use with grpc.RegisterService, and not to be introspected or modified (even as a copy)

View Source
var File_weather_weather_proto protoreflect.FileDescriptor
View Source
var File_weather_weather_service_proto protoreflect.FileDescriptor

Functions

func RegisterAmbientLocalWeatherServiceHandler added in v0.13.0

func RegisterAmbientLocalWeatherServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error

RegisterAmbientLocalWeatherServiceHandler registers the http handlers for service AmbientLocalWeatherService to "mux". The handlers forward requests to the grpc endpoint over "conn".

func RegisterAmbientLocalWeatherServiceHandlerClient added in v0.13.0

func RegisterAmbientLocalWeatherServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AmbientLocalWeatherServiceClient) error

RegisterAmbientLocalWeatherServiceHandlerClient registers the http handlers for service AmbientLocalWeatherService to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AmbientLocalWeatherServiceClient". Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AmbientLocalWeatherServiceClient" doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in "AmbientLocalWeatherServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares.

func RegisterAmbientLocalWeatherServiceHandlerFromEndpoint added in v0.13.0

func RegisterAmbientLocalWeatherServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error)

RegisterAmbientLocalWeatherServiceHandlerFromEndpoint is same as RegisterAmbientLocalWeatherServiceHandler but automatically dials to "endpoint" and closes the connection when "ctx" gets done.

func RegisterAmbientLocalWeatherServiceHandlerServer added in v0.13.0

func RegisterAmbientLocalWeatherServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AmbientLocalWeatherServiceServer) error

RegisterAmbientLocalWeatherServiceHandlerServer registers the http handlers for service AmbientLocalWeatherService to "mux". UnaryRPC :call AmbientLocalWeatherServiceServer directly. StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAmbientLocalWeatherServiceHandlerFromEndpoint instead. GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call.

func RegisterAmbientLocalWeatherServiceServer

func RegisterAmbientLocalWeatherServiceServer(s grpc.ServiceRegistrar, srv AmbientLocalWeatherServiceServer)

Types

type AmbientLocalWeatherServiceClient

type AmbientLocalWeatherServiceClient interface {
	GetWeather(ctx context.Context, in *GetWeatherRequest, opts ...grpc.CallOption) (*GetWeatherResponse, error)
	CountWeatherUpdates(ctx context.Context, in *CountWeatherUpdatesRequest, opts ...grpc.CallOption) (*CountWeatherUpdatesResponse, error)
}

AmbientLocalWeatherServiceClient is the client API for AmbientLocalWeatherService service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.

type AmbientLocalWeatherServiceServer

type AmbientLocalWeatherServiceServer interface {
	GetWeather(context.Context, *GetWeatherRequest) (*GetWeatherResponse, error)
	CountWeatherUpdates(context.Context, *CountWeatherUpdatesRequest) (*CountWeatherUpdatesResponse, error)
	// contains filtered or unexported methods
}

AmbientLocalWeatherServiceServer is the server API for AmbientLocalWeatherService service. All implementations must embed UnimplementedAmbientLocalWeatherServiceServer for forward compatibility.

type BatteryStatus

type BatteryStatus struct {
	Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"`
	Status    *int32 `protobuf:"varint,2,opt,name=status,proto3,oneof" json:"status,omitempty"`
	// contains filtered or unexported fields
}

Represents battery status for different components

func (*BatteryStatus) Descriptor deprecated

func (*BatteryStatus) Descriptor() ([]byte, []int)

Deprecated: Use BatteryStatus.ProtoReflect.Descriptor instead.

func (*BatteryStatus) GetComponent

func (x *BatteryStatus) GetComponent() string

func (*BatteryStatus) GetStatus

func (x *BatteryStatus) GetStatus() int32

func (*BatteryStatus) ProtoMessage

func (*BatteryStatus) ProtoMessage()

func (*BatteryStatus) ProtoReflect

func (x *BatteryStatus) ProtoReflect() protoreflect.Message

func (*BatteryStatus) Reset

func (x *BatteryStatus) Reset()

func (*BatteryStatus) String

func (x *BatteryStatus) String() string

type CountWeatherUpdatesRequest added in v0.14.0

type CountWeatherUpdatesRequest struct {
	Opts *GetWeatherOpts `protobuf:"bytes,1,opt,name=opts,proto3" json:"opts,omitempty"`
	// contains filtered or unexported fields
}

func (*CountWeatherUpdatesRequest) Descriptor deprecated added in v0.14.0

func (*CountWeatherUpdatesRequest) Descriptor() ([]byte, []int)

Deprecated: Use CountWeatherUpdatesRequest.ProtoReflect.Descriptor instead.

func (*CountWeatherUpdatesRequest) GetOpts added in v0.14.0

func (*CountWeatherUpdatesRequest) ProtoMessage added in v0.14.0

func (*CountWeatherUpdatesRequest) ProtoMessage()

func (*CountWeatherUpdatesRequest) ProtoReflect added in v0.14.0

func (*CountWeatherUpdatesRequest) Reset added in v0.14.0

func (x *CountWeatherUpdatesRequest) Reset()

func (*CountWeatherUpdatesRequest) String added in v0.14.0

func (x *CountWeatherUpdatesRequest) String() string

type CountWeatherUpdatesResponse added in v0.14.0

type CountWeatherUpdatesResponse struct {
	Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
	// contains filtered or unexported fields
}

func (*CountWeatherUpdatesResponse) Descriptor deprecated added in v0.14.0

func (*CountWeatherUpdatesResponse) Descriptor() ([]byte, []int)

Deprecated: Use CountWeatherUpdatesResponse.ProtoReflect.Descriptor instead.

func (*CountWeatherUpdatesResponse) GetCount added in v0.14.0

func (x *CountWeatherUpdatesResponse) GetCount() int32

func (*CountWeatherUpdatesResponse) ProtoMessage added in v0.14.0

func (*CountWeatherUpdatesResponse) ProtoMessage()

func (*CountWeatherUpdatesResponse) ProtoReflect added in v0.14.0

func (*CountWeatherUpdatesResponse) Reset added in v0.14.0

func (x *CountWeatherUpdatesResponse) Reset()

func (*CountWeatherUpdatesResponse) String added in v0.14.0

func (x *CountWeatherUpdatesResponse) String() string

type GetWeatherOpts

type GetWeatherOpts struct {
	StationName *string `protobuf:"bytes,1,opt,name=station_name,json=stationName,proto3,oneof" json:"station_name,omitempty"`
	StationType *string `protobuf:"bytes,2,opt,name=station_type,json=stationType,proto3,oneof" json:"station_type,omitempty"`
	// contains filtered or unexported fields
}

func (*GetWeatherOpts) Descriptor deprecated

func (*GetWeatherOpts) Descriptor() ([]byte, []int)

Deprecated: Use GetWeatherOpts.ProtoReflect.Descriptor instead.

func (*GetWeatherOpts) GetStationName

func (x *GetWeatherOpts) GetStationName() string

func (*GetWeatherOpts) GetStationType

func (x *GetWeatherOpts) GetStationType() string

func (*GetWeatherOpts) ProtoMessage

func (*GetWeatherOpts) ProtoMessage()

func (*GetWeatherOpts) ProtoReflect

func (x *GetWeatherOpts) ProtoReflect() protoreflect.Message

func (*GetWeatherOpts) Reset

func (x *GetWeatherOpts) Reset()

func (*GetWeatherOpts) String

func (x *GetWeatherOpts) String() string

type GetWeatherRequest

type GetWeatherRequest struct {
	Opts  *GetWeatherOpts `protobuf:"bytes,1,opt,name=opts,proto3" json:"opts,omitempty"`
	Limit *int32          `protobuf:"varint,2,opt,name=limit,proto3,oneof" json:"limit,omitempty"`
	// contains filtered or unexported fields
}

func (*GetWeatherRequest) Descriptor deprecated

func (*GetWeatherRequest) Descriptor() ([]byte, []int)

Deprecated: Use GetWeatherRequest.ProtoReflect.Descriptor instead.

func (*GetWeatherRequest) GetLimit added in v0.10.0

func (x *GetWeatherRequest) GetLimit() int32

func (*GetWeatherRequest) GetOpts

func (x *GetWeatherRequest) GetOpts() *GetWeatherOpts

func (*GetWeatherRequest) ProtoMessage

func (*GetWeatherRequest) ProtoMessage()

func (*GetWeatherRequest) ProtoReflect

func (x *GetWeatherRequest) ProtoReflect() protoreflect.Message

func (*GetWeatherRequest) Reset

func (x *GetWeatherRequest) Reset()

func (*GetWeatherRequest) String

func (x *GetWeatherRequest) String() string

type GetWeatherResponse

type GetWeatherResponse struct {
	LastUpdated    *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"`
	WeatherUpdates []*WeatherUpdate       `protobuf:"bytes,2,rep,name=weather_updates,json=weatherUpdates,proto3" json:"weather_updates,omitempty"`
	// contains filtered or unexported fields
}

func (*GetWeatherResponse) Descriptor deprecated

func (*GetWeatherResponse) Descriptor() ([]byte, []int)

Deprecated: Use GetWeatherResponse.ProtoReflect.Descriptor instead.

func (*GetWeatherResponse) GetLastUpdated

func (x *GetWeatherResponse) GetLastUpdated() *timestamppb.Timestamp

func (*GetWeatherResponse) GetWeatherUpdates

func (x *GetWeatherResponse) GetWeatherUpdates() []*WeatherUpdate

func (*GetWeatherResponse) ProtoMessage

func (*GetWeatherResponse) ProtoMessage()

func (*GetWeatherResponse) ProtoReflect

func (x *GetWeatherResponse) ProtoReflect() protoreflect.Message

func (*GetWeatherResponse) Reset

func (x *GetWeatherResponse) Reset()

func (*GetWeatherResponse) String

func (x *GetWeatherResponse) String() string

type TempHumiditySensor

type TempHumiditySensor struct {
	Name     string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	TempF    *float64 `protobuf:"fixed64,2,opt,name=temp_f,json=tempF,proto3,oneof" json:"temp_f,omitempty"`
	Humidity *int32   `protobuf:"varint,3,opt,name=humidity,proto3,oneof" json:"humidity,omitempty"`
	// contains filtered or unexported fields
}

Represents a temperature and humidity sensor

func (*TempHumiditySensor) Descriptor deprecated

func (*TempHumiditySensor) Descriptor() ([]byte, []int)

Deprecated: Use TempHumiditySensor.ProtoReflect.Descriptor instead.

func (*TempHumiditySensor) GetHumidity

func (x *TempHumiditySensor) GetHumidity() int32

func (*TempHumiditySensor) GetName

func (x *TempHumiditySensor) GetName() string

func (*TempHumiditySensor) GetTempF

func (x *TempHumiditySensor) GetTempF() float64

func (*TempHumiditySensor) ProtoMessage

func (*TempHumiditySensor) ProtoMessage()

func (*TempHumiditySensor) ProtoReflect

func (x *TempHumiditySensor) ProtoReflect() protoreflect.Message

func (*TempHumiditySensor) Reset

func (x *TempHumiditySensor) Reset()

func (*TempHumiditySensor) String

func (x *TempHumiditySensor) String() string

type UnimplementedAmbientLocalWeatherServiceServer

type UnimplementedAmbientLocalWeatherServiceServer struct{}

UnimplementedAmbientLocalWeatherServiceServer must be embedded to have forward compatible implementations.

NOTE: this should be embedded by value instead of pointer to avoid a nil pointer dereference when methods are called.

func (UnimplementedAmbientLocalWeatherServiceServer) CountWeatherUpdates added in v0.14.0

func (UnimplementedAmbientLocalWeatherServiceServer) GetWeather

type UnsafeAmbientLocalWeatherServiceServer

type UnsafeAmbientLocalWeatherServiceServer interface {
	// contains filtered or unexported methods
}

UnsafeAmbientLocalWeatherServiceServer may be embedded to opt out of forward compatibility for this service. Use of this interface is not recommended, as added methods to AmbientLocalWeatherServiceServer will result in compilation errors.

type WeatherUpdate

type WeatherUpdate struct {
	StationName         string                 `protobuf:"bytes,1,opt,name=station_name,json=stationName,proto3" json:"station_name,omitempty"`
	StationType         string                 `protobuf:"bytes,2,opt,name=station_type,json=stationType,proto3" json:"station_type,omitempty"`
	StationId           string                 `protobuf:"bytes,3,opt,name=station_id,json=stationId,proto3" json:"station_id,omitempty"`
	TempOutdoorF        *float64               `protobuf:"fixed64,4,opt,name=temp_outdoor_f,json=tempOutdoorF,proto3,oneof" json:"temp_outdoor_f,omitempty"`
	TempIndoorF         *float64               `protobuf:"fixed64,5,opt,name=temp_indoor_f,json=tempIndoorF,proto3,oneof" json:"temp_indoor_f,omitempty"`
	HumidityOutdoor     *int32                 `protobuf:"varint,6,opt,name=humidity_outdoor,json=humidityOutdoor,proto3,oneof" json:"humidity_outdoor,omitempty"`
	HumidityIndoor      *int32                 `protobuf:"varint,7,opt,name=humidity_indoor,json=humidityIndoor,proto3,oneof" json:"humidity_indoor,omitempty"`
	WindSpeedMph        *float64               `protobuf:"fixed64,8,opt,name=wind_speed_mph,json=windSpeedMph,proto3,oneof" json:"wind_speed_mph,omitempty"`
	WindGustMph         *float64               `protobuf:"fixed64,9,opt,name=wind_gust_mph,json=windGustMph,proto3,oneof" json:"wind_gust_mph,omitempty"`
	MaxDailyGust        *float64               `protobuf:"fixed64,10,opt,name=max_daily_gust,json=maxDailyGust,proto3,oneof" json:"max_daily_gust,omitempty"`
	WindDir             *int32                 `protobuf:"varint,11,opt,name=wind_dir,json=windDir,proto3,oneof" json:"wind_dir,omitempty"`
	WindDirAvg_10M      *int32                 `protobuf:"varint,12,opt,name=wind_dir_avg_10m,json=windDirAvg10m,proto3,oneof" json:"wind_dir_avg_10m,omitempty"`
	Uv                  *int32                 `protobuf:"varint,13,opt,name=uv,proto3,oneof" json:"uv,omitempty"`
	SolarRadiation      *float64               `protobuf:"fixed64,14,opt,name=solar_radiation,json=solarRadiation,proto3,oneof" json:"solar_radiation,omitempty"`
	HourlyRainIn        *float64               `protobuf:"fixed64,15,opt,name=hourly_rain_in,json=hourlyRainIn,proto3,oneof" json:"hourly_rain_in,omitempty"`
	EventRainIn         *float64               `protobuf:"fixed64,16,opt,name=event_rain_in,json=eventRainIn,proto3,oneof" json:"event_rain_in,omitempty"`
	DailyRainIn         *float64               `protobuf:"fixed64,17,opt,name=daily_rain_in,json=dailyRainIn,proto3,oneof" json:"daily_rain_in,omitempty"`
	WeeklyRainIn        *float64               `protobuf:"fixed64,18,opt,name=weekly_rain_in,json=weeklyRainIn,proto3,oneof" json:"weekly_rain_in,omitempty"`
	MonthlyRainIn       *float64               `protobuf:"fixed64,19,opt,name=monthly_rain_in,json=monthlyRainIn,proto3,oneof" json:"monthly_rain_in,omitempty"`
	YearlyRainIn        *float64               `protobuf:"fixed64,20,opt,name=yearly_rain_in,json=yearlyRainIn,proto3,oneof" json:"yearly_rain_in,omitempty"`
	TotalRainIn         *float64               `protobuf:"fixed64,21,opt,name=total_rain_in,json=totalRainIn,proto3,oneof" json:"total_rain_in,omitempty"`
	Batteries           []*BatteryStatus       `protobuf:"bytes,22,rep,name=batteries,proto3" json:"batteries,omitempty"`
	BaromRelativeIn     *float64               `protobuf:"fixed64,23,opt,name=barom_relative_in,json=baromRelativeIn,proto3,oneof" json:"barom_relative_in,omitempty"`
	BaromAbsoluteIn     *float64               `protobuf:"fixed64,24,opt,name=barom_absolute_in,json=baromAbsoluteIn,proto3,oneof" json:"barom_absolute_in,omitempty"`
	DewPointF           *float64               `protobuf:"fixed64,25,opt,name=dew_point_f,json=dewPointF,proto3,oneof" json:"dew_point_f,omitempty"`
	WindChillF          *float64               `protobuf:"fixed64,26,opt,name=wind_chill_f,json=windChillF,proto3,oneof" json:"wind_chill_f,omitempty"`
	TempHumiditySensors []*TempHumiditySensor  `protobuf:"bytes,27,rep,name=temp_humidity_sensors,json=tempHumiditySensors,proto3" json:"temp_humidity_sensors,omitempty"`
	UpdateTimestamp     *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=update_timestamp,json=updateTimestamp,proto3" json:"update_timestamp,omitempty"`
	LightningDay        *int32                 `protobuf:"varint,29,opt,name=lightning_day,json=lightningDay,proto3,oneof" json:"lightning_day,omitempty"`
	LightningDistance   *int32                 `protobuf:"varint,30,opt,name=lightning_distance,json=lightningDistance,proto3,oneof" json:"lightning_distance,omitempty"`
	LightningLastTime   *timestamppb.Timestamp `protobuf:"bytes,31,opt,name=lightning_last_time,json=lightningLastTime,proto3,oneof" json:"lightning_last_time,omitempty"`
	// contains filtered or unexported fields
}

func (*WeatherUpdate) Descriptor deprecated

func (*WeatherUpdate) Descriptor() ([]byte, []int)

Deprecated: Use WeatherUpdate.ProtoReflect.Descriptor instead.

func (*WeatherUpdate) GetBaromAbsoluteIn

func (x *WeatherUpdate) GetBaromAbsoluteIn() float64

func (*WeatherUpdate) GetBaromRelativeIn

func (x *WeatherUpdate) GetBaromRelativeIn() float64

func (*WeatherUpdate) GetBatteries

func (x *WeatherUpdate) GetBatteries() []*BatteryStatus

func (*WeatherUpdate) GetDailyRainIn

func (x *WeatherUpdate) GetDailyRainIn() float64

func (*WeatherUpdate) GetDewPointF

func (x *WeatherUpdate) GetDewPointF() float64

func (*WeatherUpdate) GetEventRainIn

func (x *WeatherUpdate) GetEventRainIn() float64

func (*WeatherUpdate) GetHourlyRainIn

func (x *WeatherUpdate) GetHourlyRainIn() float64

func (*WeatherUpdate) GetHumidityIndoor

func (x *WeatherUpdate) GetHumidityIndoor() int32

func (*WeatherUpdate) GetHumidityOutdoor

func (x *WeatherUpdate) GetHumidityOutdoor() int32

func (*WeatherUpdate) GetLightningDay added in v0.15.3

func (x *WeatherUpdate) GetLightningDay() int32

func (*WeatherUpdate) GetLightningDistance added in v0.15.3

func (x *WeatherUpdate) GetLightningDistance() int32

func (*WeatherUpdate) GetLightningLastTime added in v0.17.0

func (x *WeatherUpdate) GetLightningLastTime() *timestamppb.Timestamp

func (*WeatherUpdate) GetMaxDailyGust

func (x *WeatherUpdate) GetMaxDailyGust() float64

func (*WeatherUpdate) GetMonthlyRainIn

func (x *WeatherUpdate) GetMonthlyRainIn() float64

func (*WeatherUpdate) GetSolarRadiation

func (x *WeatherUpdate) GetSolarRadiation() float64

func (*WeatherUpdate) GetStationId

func (x *WeatherUpdate) GetStationId() string

func (*WeatherUpdate) GetStationName

func (x *WeatherUpdate) GetStationName() string

func (*WeatherUpdate) GetStationType

func (x *WeatherUpdate) GetStationType() string

func (*WeatherUpdate) GetTempHumiditySensors

func (x *WeatherUpdate) GetTempHumiditySensors() []*TempHumiditySensor

func (*WeatherUpdate) GetTempIndoorF

func (x *WeatherUpdate) GetTempIndoorF() float64

func (*WeatherUpdate) GetTempOutdoorF

func (x *WeatherUpdate) GetTempOutdoorF() float64

func (*WeatherUpdate) GetTotalRainIn

func (x *WeatherUpdate) GetTotalRainIn() float64

func (*WeatherUpdate) GetUpdateTimestamp added in v0.12.0

func (x *WeatherUpdate) GetUpdateTimestamp() *timestamppb.Timestamp

func (*WeatherUpdate) GetUv

func (x *WeatherUpdate) GetUv() int32

func (*WeatherUpdate) GetWeeklyRainIn

func (x *WeatherUpdate) GetWeeklyRainIn() float64

func (*WeatherUpdate) GetWindChillF

func (x *WeatherUpdate) GetWindChillF() float64

func (*WeatherUpdate) GetWindDir

func (x *WeatherUpdate) GetWindDir() int32

func (*WeatherUpdate) GetWindDirAvg_10M

func (x *WeatherUpdate) GetWindDirAvg_10M() int32

func (*WeatherUpdate) GetWindGustMph

func (x *WeatherUpdate) GetWindGustMph() float64

func (*WeatherUpdate) GetWindSpeedMph

func (x *WeatherUpdate) GetWindSpeedMph() float64

func (*WeatherUpdate) GetYearlyRainIn

func (x *WeatherUpdate) GetYearlyRainIn() float64

func (*WeatherUpdate) ProtoMessage

func (*WeatherUpdate) ProtoMessage()

func (*WeatherUpdate) ProtoReflect

func (x *WeatherUpdate) ProtoReflect() protoreflect.Message

func (*WeatherUpdate) Reset

func (x *WeatherUpdate) Reset()

func (*WeatherUpdate) String

func (x *WeatherUpdate) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL