ada_language_server_22.0.0_ef4bdf41/source/uri/uris.ads

  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
------------------------------------------------------------------------------
--                         Language Server Protocol                         --
--                                                                          --
--                     Copyright (C) 2018-2019, AdaCore                     --
--                                                                          --
-- This is free software;  you can redistribute it  and/or modify it  under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  This software is distributed in the hope  that it will be useful, --
-- but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public --
-- License for  more details.  You should have  received  a copy of the GNU --
-- General  Public  License  distributed  with  this  software;   see  file --
-- COPYING3.  If not, go to http://www.gnu.org/licenses for a complete copy --
-- of the license.                                                          --
------------------------------------------------------------------------------
--
--  URI (Uniform Resource Identifier) described in RFC 3986.
--  This package provides URI type corresponding methods.
--

with Ada.Containers.Doubly_Linked_Lists;
with Ada.Iterator_Interfaces;
with Ada.Strings.Unbounded;
with Ada.Strings.UTF_Encoding;

with GNAT.OS_Lib;

package URIs is

   subtype UTF_8_String is Ada.Strings.UTF_Encoding.UTF_8_String;

   --  A URI is a sequence of characters from a very limited set: the letters
   --  of the basic Latin alphabet, digits, and a few special characters.
   subtype URI_String is String
     with Dynamic_Predicate =>
       (for all Char of URI_String =>
          Char in 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9'
            | '-' | '.' | '_' | '~'
            | ':' | '/' | '?' | '#' | '[' | ']' | '@'
            | '!' | '$' | '&' | ''' | '(' | ')'
            | '*' | '+' | ',' | ';' | '=' | '%');

   type URI is tagged limited private;
   --  URI is an Uniform Resource Identifier.

   function Scheme (Self : URI'Class) return String;
   --  Return scheme part of the URI. Case-insensitive, so always in lowercase

   procedure Set_Scheme
     (Self  : in out URI'Class;
      Value : String)
     with Pre =>
       Value'Length > 1
       and then Value (Value'First) in 'a' .. 'z' | 'A' .. 'Z'
       and then (for all Char of Value => Char in
                 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '+' | '-' | '.');

   function Host (Self : URI'Class) return UTF_8_String;
   --  Return host of authority from the URI.
   --  Case-insensitive, so always in lowercase

   procedure Set_Host
     (Self  : in out URI'Class;
      Value : UTF_8_String);

   type Path_Cursor is tagged private;
   --  Cursor to iterate over URI path segments

   function Has_Element (Position : Path_Cursor) return Boolean;

   function To_String (Position : Path_Cursor) return String;
   --  Return segment value without a separator

   package Iterator_Interfaces is new
     Ada.Iterator_Interfaces (Path_Cursor, Has_Element);

   function Each_Path_Segment
     (Self : URI'Class) return Iterator_Interfaces.Reversible_Iterator'Class;
   --  Iterate over each segment

   procedure Add_Path_Segment
     (Self  : in out URI'Class;
      Value : UTF_8_String);
   --  Append next path segment to URI's path

   function To_String (Self : URI'Class) return URI_String;
   --  Convert URI to string form

   procedure Parse
     (Self    : out URI'Class;
      Text    : String;
      Success : out Boolean);
   --  Parse given text of uri into the URI object.

   package Conversions is
      function From_File (Full_Path : String) return URI_String
        with Pre => GNAT.OS_Lib.Is_Absolute_Path (Full_Path);
      --  Convert from file to URI in form of file://path
      --  Argument should be a absolute path (not relative one).
      --
      --  On Windows:
      --  "z:\ar" converted to "file:///z%3A/ar"
      --  "\\VBOXSVR\tmp\ar" converted to "file://vboxsvr/tmp/ar"
      --
      --  On Linux:
      --  "/tmp/ar" converted to "file:///tmp/ar"

      function To_File (URI : URI_String; Normalize : Boolean) return String;
      --  Convert from file:// URI to file full path. If Normalize = True
      --  then convert result is independ on letter case and symlinks.
   end Conversions;

private

   package Unbounded_String_Lists is new Ada.Containers.Doubly_Linked_Lists
     (Ada.Strings.Unbounded.Unbounded_String,
      Ada.Strings.Unbounded."=");

   type URI is tagged limited record
      Scheme    : Ada.Strings.Unbounded.Unbounded_String;
      User_Info : Ada.Strings.Unbounded.Unbounded_String;
      Host      : Ada.Strings.Unbounded.Unbounded_String;
      Port      : Natural := 0;
      Path      : Unbounded_String_Lists.List;
   end record;

   type Path_Cursor is tagged record
      Value : Unbounded_String_Lists.Cursor;
   end record;

end URIs;