1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
|
# Copyright 2014 - present MongoDB, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
package MongoDB::_Types;
# MongoDB type definitions
use version;
our $VERSION = 'v2.2.2';
use Type::Library
-base,
-declare => qw(
ArrayOfHashRef
AuthMechanism
Boolish
Booleanpm
BSONCodec
BSONDoc
ClientSession
CompressionType
ZlibCompressionLevel
ConnectType
CursorType
DBRefColl
DBRefDB
Document
ErrorStr
HashLike
HeartbeatFreq
HostAddress
HostAddressList
Intish
IndexModel
IndexModelList
IxHash
MaxStalenessNum
MaybeHashRef
MongoDBClient
MongoDBCollection
MongoDBDatabase
BSONTimestamp
NonEmptyStr
NonNegNum
Numish
OID
OrderedDoc
PairArrayRef
ReadPrefMode
ReadConcern
ReadPreference
ServerDesc
ServerType
SingleChar
SingleKeyHash
Stringish
TopologyType
TransactionState
WriteConcern
);
use Type::Utils -all;
use Types::Standard qw(
Any
Bool
ArrayRef
Dict
HashRef
Int
Maybe
Num
Optional
Overload
Ref
Str
Undef
);
use Scalar::Util qw/reftype/;
use boolean 0.25;
use MongoDB::_Constants;
require Tie::IxHash;
#--------------------------------------------------------------------------#
# Type declarations (without inherited coercions)
#--------------------------------------------------------------------------#
declare Stringish, as Str|Overload['""'];
declare Numish, as Num|Overload['0+'];
# Types::Standard::Bool is overly restrictive, not allowing objects that
# overload boolification, and Overload['bool'] doesn't detect objects that
# overload via fallback, so we use this type for documentation purposes,
# but allow any actual type.
declare Boolish, as Any;
declare ArrayOfHashRef, as ArrayRef [HashRef];
enum AuthMechanism,
[qw/NONE DEFAULT MONGODB-CR MONGODB-X509 GSSAPI PLAIN SCRAM-SHA-1 SCRAM-SHA-256/];
duck_type BSONCodec, [ qw/encode_one decode_one/ ];
class_type BSONDoc, { class => 'BSON::Doc' };
class_type ClientSession, { class => 'MongoDB::ClientSession' };
enum CompressionType, [qw/zlib zstd snappy/];
declare ZlibCompressionLevel, as Int,
where { $_ >= -1 && $_ <= 9 },
message { "zlib compression value must be value from -1 to 9" };
enum ConnectType, [qw/replicaSet direct none/];
enum CursorType, [qw/non_tailable tailable tailable_await/];
declare ErrorStr, as Stringish, where { defined($_) && length($_) }; # needs a true value
declare HashLike, as Ref, where { reftype($_) eq 'HASH' };
declare HeartbeatFreq, as Num,
where { defined($_) && $_ >= 500 },
message { "value must be at least 500" };
# XXX loose address validation for now. Host part should really be hostname or
# IPv4/IPv6 literals
declare HostAddress, as Stringish,
where { $_ =~ /^[^:]+:[0-9]+$/ and lc($_) eq $_ }, message {
"Address '$_' either not lowercased or not formatted as 'hostname:port'"
};
declare HostAddressList, as ArrayRef [HostAddress], message {
"Address list <@$_> not all formatted as lowercased 'hostname:port' pairs"
};
declare Intish, as Numish, where { defined $_ and $_ == int($_) };
class_type IxHash, { class => 'Tie::IxHash' };
declare MaybeHashRef, as Maybe[ HashRef ];
class_type MongoDBClient, { class => 'MongoDB::MongoClient' };
class_type MongoDBCollection, { class => 'MongoDB::Collection' };
class_type MongoDBDatabase, { class => 'MongoDB::Database' };
class_type BSONTimestamp, { class => 'BSON::Timestamp' };
declare NonEmptyStr, as Stringish, where { defined $_ && length $_ };
declare NonNegNum, as Numish,
where { defined($_) && $_ >= 0 },
message { "value must be a non-negative number" };
declare MaxStalenessNum, as Numish,
where { defined($_) && ( $_ > 0 || $_ == -1 ) },
message { "value must be a positive number or -1" };
declare OID, as Str, where { /\A[0-9a-f]{24}\z/ }, message {
"Value '$_' is not a valid OID"
};
declare PairArrayRef, as ArrayRef,
where { @$_ % 2 == 0 };
enum ReadPrefMode,
[qw/primary primaryPreferred secondary secondaryPreferred nearest/];
class_type ReadPreference, { class => 'MongoDB::ReadPreference' };
class_type ReadConcern, { class => 'MongoDB::ReadConcern' };
class_type ServerDesc, { class => 'MongoDB::_Server' };
enum ServerType,
[
qw/Standalone Mongos PossiblePrimary RSPrimary RSSecondary RSArbiter RSOther RSGhost Unknown/
];
declare SingleChar, as Str, where { length $_ eq 1 };
declare SingleKeyHash, as HashRef, where { 1 == scalar keys %$_ };
enum TopologyType,
[qw/Single ReplicaSetNoPrimary ReplicaSetWithPrimary Sharded Direct Unknown/];
enum TransactionState,
[ TXN_NONE, TXN_STARTING, TXN_IN_PROGRESS, TXN_COMMITTED, TXN_ABORTED ];
class_type WriteConcern, { class => 'MongoDB::WriteConcern' };
# after SingleKeyHash, PairArrayRef and IxHash
declare OrderedDoc, as BSONDoc|PairArrayRef|IxHash|SingleKeyHash;
declare Document, as HashRef|BSONDoc|PairArrayRef|IxHash|HashLike;
# after NonEmptyStr
declare DBRefColl, as NonEmptyStr;
declare DBRefDB, as NonEmptyStr|Undef;
# after OrderedDoc
declare IndexModel, as Dict [ keys => OrderedDoc, options => Optional [HashRef] ];
declare IndexModelList, as ArrayRef [IndexModel];
#--------------------------------------------------------------------------#
# Coercions
#--------------------------------------------------------------------------#
coerce ArrayOfHashRef, from HashRef, via { [$_] };
coerce BSONCodec, from HashRef,
via { require BSON; BSON->new($_) };
coerce Boolish, from Any, via { !!$_ };
coerce DBRefColl, from MongoDBCollection, via { $_->name };
coerce DBRefDB, from MongoDBDatabase, via { $_->name };
coerce ErrorStr, from Str, via { $_ || "unspecified error" };
coerce ReadPrefMode, from Str, via { $_ = lc $_; s/_?preferred/Preferred/; $_ };
coerce IxHash, from HashRef, via { Tie::IxHash->new(%$_) };
coerce IxHash, from ArrayRef, via { Tie::IxHash->new(@$_) };
coerce IxHash, from HashLike, via { Tie::IxHash->new(%$_) };
coerce IxHash, from BSONDoc, via { Tie::IxHash->new(@$_) };
coerce OID, from Str, via { lc $_ };
coerce ReadPreference, from HashRef,
via { require MongoDB::ReadPreference; MongoDB::ReadPreference->new($_) };
coerce ReadPreference, from Str,
via { require MongoDB::ReadPreference; MongoDB::ReadPreference->new( mode => $_ ) };
coerce ReadPreference, from ArrayRef,
via { require MongoDB::ReadPreference; MongoDB::ReadPreference->new( mode => $_->[0], tag_sets => $_->[1] ) };
coerce ReadConcern, from Str,
via { require MongoDB::ReadConcern; MongoDB::ReadConcern->new( level => $_ ) };
coerce ReadConcern, from HashRef,
via { require MongoDB::ReadConcern; MongoDB::ReadConcern->new($_) };
coerce WriteConcern, from HashRef,
via { require MongoDB::WriteConcern; MongoDB::WriteConcern->new($_) };
1;
|